最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 23311    Accepted Submission(s): 6963

Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。

(1<n<=1000, 0<m<100000, s != t)
 
Output
输出 一行有两个数, 最短距离及其花费。
 
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
 
Sample Output
9 11

 解题思路:
朴素的Dij算法的基础增加额外的判断条件,在求最短路径的基础之上再去比较花费,记录最小值




源代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std; const int MAXN=1005;
const int INF=0x3f3f3f3f; int Graph[MAXN][MAXN];
int Cost[MAXN][MAXN];
int s,e;//开始,结束
int m,n;//边数,顶点数
int d[MAXN];//保存最小距离
int c[MAXN];//保存最小话费
bool used[MAXN];//是否已经加入 void Dijkstra()
{
int v;
int minpath;
for(int i=1;i<=n;i++)
{
d[i]=Graph[s][i];
c[i]=Cost[s][i];
}
memset(used,false,sizeof(used));
used[s]=true;
for(int i=1;i<=n;i++)
{
if(used[e])
{
break;
}
minpath=INF;
for(int j=1;j<=n;j++)
{
if(!used[j]&&d[j]<minpath)
{
minpath=d[j];
v=j;
}
}
used[v]=true;
for(int j=1;j<=n;j++)
{
if(!used[j]&&Graph[v][j]<INF)
{
if(d[j]>d[v]+Graph[v][j])
{
d[j]=d[v]+Graph[v][j];
c[j]=c[v]+Cost[v][j];
}
else if(d[j]==d[v]+Graph[v][j])
{
if(c[j]>c[v]+Cost[v][j])
{
c[j]=c[v]+Cost[v][j];
}
}
}
}
}
printf("%d %d\n",d[e],c[e]);
} int main()
{
while(scanf("%d %d",&n,&m)!=EOF&&n+m)
{
memset(Graph,INF,sizeof(Graph));
memset(Cost,INF,sizeof(Cost));
for(int i=1;i<=n;i++)
{
Graph[i][i]=0;
Cost[i][i]=0;
}
int v,u,len,money;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&v,&u,&len,&money);
if(Graph[v][u]>len)
{
Graph[v][u]=len;Graph[u][v]=len;
Cost[v][u]=money;Cost[u][v]=money;
}
else if(Graph[v][u]==len)
{
if(Cost[v][u]>money)
{
Cost[v][u]=money;Cost[u][v]=money;
}
}
}
scanf("%d %d",&s,&e);
Dijkstra();
}
return 0;
}


HDU3790-最短路径问题的更多相关文章

  1. HDU-3790 最短路径问题

    最短路径问题 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  2. hdu-3790最短路径问题

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  3. HDU-3790最短路径问题,第十遍终于过了~

    最短路径问题                                                                   Time Limit: 2000/1000 MS (J ...

  4. hdu3790最短路径问题 (用优先队列实现的)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  5. hdu3790最短路径问题

    题意是这种,给你一个无向图, 每条边有距离和花费, 假设从第一个点到末点的最短路不唯一, 则输出最短路长度以及最少的花费. 否则输出长度和花费即可. 用传说中的链式向前星优化了一下边的存储, 写了个s ...

  6. hdu-3790 最短路径问题(双重权值)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input ...

  7. HDU-3790 最短路径问题(双重权值)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  8. hdu3790最短路径问题(BFS+优先队列)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  9. hdu-3790 最短路径问题---dijkstra两重权值

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到 ...

  10. 最短路径-Dijkstra+Floyd+Spfa

    Dijkstra算法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra ...

随机推荐

  1. vue之地址栏#号问题

    mode的两个值 histroy:当你使用 history 模式时,URL 就像正常的 url,例如 http://jsapng.com/lms/,也好看! hash:默认'hash'值,但是hash ...

  2. spring框架应用系列三:切面编程(带参数)

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7786715.html 解决问题 1.分离业务监控与业务处理.简单点 ...

  3. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速

    pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...

  4. javascript 关于 this 作用域链

    使用 function f() {}  或者 var f = function() {}  来定义的函数,this 是指向 全局对象   var  a = {    b: 1,    c: funct ...

  5. lvs学习笔记

    本人身为一个网工,最近一直在工作中学习linux的相关知识.前短时间通过自查资料学习了lvs的相关内容,摘录部分整理后和大家分享,内容较多,较琐碎,望见谅!!! LVS 从Linux内核版本2.6起, ...

  6. VMware14.0.0 版本虚拟机安装Ubuntu16.04 LTS版本Linux系统(多图详细步骤)

    一.前期准备工作 1.成功安装完成VMware14软件: 2.去Ubuntu官网下载Ubuntu16.0.4 LTS 版本的镜像文件. 二.安装步骤 1.打开VMware软件,选择<创建虚拟机& ...

  7. QT制作窗口切换的小程序

    前言:本次实验是在三个窗口之间自由切换,窗口中播放gif格式的动态图. 让我们先来看看使用到的主要的函数: 一.播放gif格式动态图的函数 QMovie *movie = new QMovie(&qu ...

  8. Asp.Net Core API网关Ocelot

    首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...

  9. C#中访问私有成员

    首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...

  10. python --- 协程编程(第三方库gevent的使用)

    1. 什么是协程? 协程(coroutine),又称微线程.协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制.一个线程可以包含多个协程,对于 ...