hdu 3790 最短路径问题
来源:互联网 发布:医疗卫生软件 编辑:程序博客网 时间:2024/06/06 06:55
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
Source
浙大计算机研究生复试上机考试-2010年
思路:最短路问题,这题要用dijkstra,用folyd会超时。
注意:这题一定要判断重边的,而且还有可能会边相同,费用不同,都要进行更新的。
AC代码:
#include <iostream>#include <cstdio>#include <cstring>#define INF 0x3f3f3f3fusing namespace std;int n, m,d, p, a, b;int map1[1005][1005];int cost[1005][1005];int vis[1005], dis[1005], money[1005];void dijkstra(int s){ for(int i = 1; i <= n; i++) { dis[i] = map1[s][i]; vis[i] = 0; money[i] = cost[s][i]; } dis[s] = 0, money[s] = 0; int minn, u; vis[s] = 1; for(int i = 1; i < n; i++) { minn = INF; for(int j = 1; j <= n; j++) { if(!vis[j]&&minn > dis[j]) { minn = dis[j]; u = j; } } vis[u] = 1; for(int j = 1; j <= n; j++) { if(map1[u][j] != INF&&vis[j]==0) { if(dis[j] > dis[u] + map1[u][j]) { dis[j] = dis[u] + map1[u][j]; money[j] = money[u] + cost[u][j]; } else if(dis[j] == dis[u] + map1[u][j]) { if(money[j] > cost[u][j] + money[u]) { money[j] = money[u] + cost[u][j]; } } } } }}int main(){ while(~scanf("%d%d",&n, &m)) { if(n==0&&m==0) break; for(int i = 0; i <= n; i++) { for(int j = 0; j <= n; j++) { map1[i][j] = INF; cost[i][j] = INF; } } for(int i = 1; i <= m; i++) { scanf("%d%d%d%d",&a, &b, &d, &p); if(map1[a][b] > d) { map1[a][b] = map1[b][a] = d; cost[a][b] = cost[b][a] = p; } else if(map1[a][b] == d&&cost[a][b] > p) ///刚开始在这里的判断出错,wa了好多次 { cost[a][b] = cost[b][a] = p; } } /*for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { printf("%10d ",map1[i][j]); } printf("\n"); } for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { printf("%10d ",cost[i][j]); } printf("\n"); }*/ int s, t; scanf("%d%d",&s,&t); dijkstra(s); printf("%d %d\n",dis[t], money[t]); } return 0;}/**5 71 2 5 52 3 4 51 3 4 63 4 2 23 5 4 74 5 2 41 3 4 41 58 10**/
0 0
- 【最短路径-Dis】hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU-3790-最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- Hdu 3790 最短路径问题
- HDU 3790 最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- 最短路径问题 hdu 3790
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu--最短路径问题--3790
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题 (SPFA)
- c++第四次实验-数组素数排序
- JavaWeb之Cookie的简单学习
- TabLayout布局之首页搭建
- Android:跟着实战项目学缓存策略之DiskLruCache详谈
- SQL复习总结
- hdu 3790 最短路径问题
- 特征匹配
- TabLayout的简单使用
- github连接超时解决方法
- Enterprise Library 企业库
- [BZOJ3495][PA2010][2-SAT]Riddle
- 第八届河南省赛题Distribution
- 你知道几种单例模式?
- 那些年收藏的Android开源库集合(控件上)