题目链接

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

分析:

就是一个求最短路呢,但是在最短路的基础上添加了对于最小花费的判断,只是多了一层判断条件。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 1007
#define INF 65535
using namespace std; int start,e;
int n,m;
int map[maxn][maxn];
int cost[maxn][maxn]; void Dijkstra()
{
int v,Min,vis[maxn];
int d[maxn],c[maxn];
for(int i = 1;i <= n;i++) {
d[i] = map[start][i];
c[i] = cost[start][i];
}
memset(vis,0,sizeof(vis));
vis[start] = 1;
for(int i = 1;i <= n;i++)
{
if(vis[e]) break;
Min = INF;
for(int j = 1;j <= n;j++)
if(!vis[j] && d[j]<Min)
Min = d[v=j];
vis[v] = 1;
for(int j = 1;j <= n;j++)
if(!vis[j] && map[v][j]<INF) {
if(d[j] > d[v]+map[v][j]) {
d[j] = d[v]+map[v][j];
c[j] = c[v]+cost[v][j];
}
else if(d[j] == d[v]+map[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) && n+m)
{
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++) {
map[i][j] = i==j?0:INF;
cost[i][j] = i==j?0:INF;
}
int a,b,c,d;
for(int i = 1;i <= m;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(map[a][b]>c)//长度不同更新长度
{
map[a][b]=map[b][a]=c;
cost[a][b]=cost[b][a]=d;
}
else if(map[a][b]==c)
{
if(cost[a][b]>d)//长度相同但是花费较小时更新花费
cost[a][b]=cost[b][a]=d;
}
}
scanf("%d%d",&start,&e);
Dijkstra();
}
return 0;
}

HDU 3790 最短路径问题 (最短路)的更多相关文章

  1. HDU 3790最短路径问题 [最短路最小花费]

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)  ...

  2. HDU 3790 最短路径问题 (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...

  3. ACM: HDU 3790 最短路径问题-Dijkstra算法

    HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  4. HDU - 3790 最短路径问题 (dijkstra算法)

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

  5. hdu 3790 最短路径问题(两个限制条件的最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...

  6. hdu 3790 最短路径问题(最短路,Dijsktra)

    题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...

  7. hdu 3790 最短路径问题(双重权值,dijkstra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...

  8. hdu 3790 最短路径问题(迪杰斯特拉)

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. HDU 3790 最短路径问题(SPFA || Dijkstra )

    题目链接 题意 : 中文题不详述. 思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次. #include < ...

随机推荐

  1. js学习1

    js基础1: js组成: ECMAScript :解释器 .翻译 提供语言的基本功能 几乎没有兼容型问题 dom :document object model 有一些兼容型问题 bom :brower ...

  2. PHP学习心得1

    php是动态网站开发的优秀语言,在学习的时候万万不能冒进.在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理,这样你很难利用 ...

  3. [51CTO]给您介绍Windows10各大版本之间区别

    给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...

  4. Python2X和Python3X的区别

    python2X:源码重复不规范python3X:整合源码,更清晰简单优美.         python2X:默认的编码是ascii  (解决办法为第一行添加 :  #-*- encoding:ut ...

  5. how to show video in website

    how to show video in website old version browsers https://www.computerhope.com/issues/ch000591.htm h ...

  6. line search中的重要定理 - 梯度与方向的点积为零

    转载请注明出处:http://www.codelast.com/ 对精确的line search(线搜索),有一个重要的定理: ∇f(xk+αkdk)Tdk=0 这个定理表明,当前点在dk方向上移动到 ...

  7. 【BZOJ4872】【Shoi2017】分手是祝愿

    Time Limit: 20 Sec Memory Limit: 512 MB Description ​ Zeit und Raum trennen dich und mich. ​ 时空将你我分开 ...

  8. Spyder使用IPython Console弹出绘图窗口的设置方法

    http://www.datastudy.cc/article/3cfc3aff3b2c5948b938456e00376276 在使用Spyder的过程中,因为它的绘图,默认是绘图在IPython窗 ...

  9. Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度

    Levenshtein Distance莱文斯坦距离定义: 数学上,两个字符串a.b之间的莱文斯坦距离表示为levab(|a|, |b|). levab(i, j) = max(i, j)  如果mi ...

  10. AES-NI指令集

    对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin. ...