hdu 3790 最短路径问题(双重权值,dijkstra算法)
来源:互联网 发布:淘宝背景音乐推荐 编辑:程序博客网 时间:2024/05/22 10:35
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 View Code
题目大意:题意明了,输出最短路径及其花费。
需要注意的几点:(1)当最短路径相同时,输出最小花费!!!
(2)更新路径的时候要注意更新花费。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int INF=9999999; 5 int map[1010][1010],Min,n,cost[1010][1010],node[1010],vis[1010]; 6 int pr[1010]; 7 8 void set() 9 {10 for (int i=1; i<=n; i++)11 {12 vis[i]=0;13 node[i]=INF;14 pr[i]=INF;15 for (int j=1; j<=n; j++)16 {17 map[i][j]=INF;18 cost[i][j]=INF;19 }20 }21 }22 23 void dijkstra(int m)24 {25 int tm=m;26 vis[m]=1;27 node[m]=0;28 pr[m]=0;29 for (int k=2; k<=n; k++)30 {31 Min=INF;32 int M=INF;33 for (int i=1; i<=n; i++)34 if(!vis[i])35 {36 if (node[i]>map[tm][i]+node[tm])37 {38 node[i]=map[tm][i]+node[tm];39 pr[i]=cost[tm][i]+pr[tm];40 }41 else if(node[i]==map[tm][i]+node[tm])42 {43 if(pr[i]>cost[tm][i]+pr[tm])44 {45 node[i]=map[tm][i]+node[tm];46 pr[i]=cost[tm][i]+pr[tm];47 }48 }49 if (Min>node[i])50 {51 M=pr[i];52 Min=node[i];53 m=i;54 }55 else if (Min==node[i])56 {57 if(M>pr[i])58 {59 M=pr[i];60 Min=node[i];61 m=i;62 }63 }64 }65 vis[m]=1;66 tm=m;67 }68 }69 70 int main ()71 {72 int a,b,d,p,m;73 while(scanf("%d%d",&n,&m),n||m)74 {75 set();76 while (m--)77 {78 scanf("%d%d%d%d",&a,&b,&d,&p);79 if (map[a][b]>d)80 {81 cost[a][b]=cost[b][a]=p;82 map[a][b]=map[b][a]=d;83 }84 else if (map[a][b]==d)85 {86 if (cost[a][b]>p)87 cost[a][b]=cost[b][a]=p;88 }89 }90 scanf("%d%d",&a,&b);91 dijkstra(a);92 printf ("%d %d\n",node[b],pr[b]);93 }94 }
一种简单明了的代码。
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int INF=9999999; 7 8 int Map[1010][1010],Min,Mmin,n,cost[1010][1010],node[1010],vis[1010]; 9 int pr[1010],tm; 10 11 void sett() 12 { 13 for (int i=1; i<=n; i++) 14 { 15 node[i]=INF; 16 vis[i]=0; 17 pr[i]=INF; 18 for (int j=1; j<=n; j++) 19 { 20 Map[i][j]=INF; 21 cost[i][j]=INF; 22 } 23 } 24 } 25 26 int dijkstra() 27 { 28 for (int i=1; i<=n; i++) 29 { 30 Min=INF; 31 Mmin=INF; 32 for (int j=1; j<=n; j++) 33 { 34 if (!vis[j]) 35 { 36 if (Min>node[j]) 37 { 38 Min=node[j]; 39 Mmin=pr[j]; 40 tm=j; 41 } 42 else if (Min==node[j]) 43 { 44 if (Mmin>pr[j]) 45 { 46 Mmin=pr[j]; 47 tm=j; 48 } 49 } 50 } 51 } 52 vis[tm]=1; 53 for (int j=1; j<=n; j++) 54 if (!vis[j]) 55 { 56 if (node[j]>Map[tm][j]+node[tm]) 57 { 58 node[j]=Map[tm][j]+node[tm]; 59 pr[j]=cost[tm][j]+pr[tm]; 60 } 61 else if (node[j]==Map[tm][j]+node[tm]) 62 { 63 if (pr[j]>cost[tm][j]+pr[tm]) 64 { 65 node[j]=Map[tm][j]+node[tm]; 66 pr[j]=cost[tm][j]+pr[tm]; 67 } 68 } 69 } 70 } 71 } 72 73 int main () 74 { 75 int m,a,b,d,p,s,t; 76 while (~scanf("%d%d",&n,&m)) 77 { 78 if (n==0&&m==0) 79 break; 80 sett(); 81 for (int i=1; i<=m; i++) 82 { 83 scanf("%d%d%d%d",&a,&b,&d,&p); 84 if (Map[a][b]>d) 85 { 86 Map[a][b]=Map[b][a]=d; 87 cost[a][b]=cost[b][a]=p; 88 } 89 else if (Map[a][b]==d) 90 { 91 if (cost[a][b]>p) 92 cost[a][b]=cost[b][a]=p; 93 } 94 } 95 scanf("%d%d",&s,&t); 96 node[s]=0; 97 pr[s]=0; 98 dijkstra(); 99 printf ("%d %d\n",node[t],pr[t]);100 }101 }
0 0
- HDU 3790 最短路径问题(双重Dijkstra算法)
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
- HDU 3790 简单最短路径问题(dijkstra+双重权值)
- HDU 3790 最短路径问题 (dijkstra+双重条件)
- HDU 3790 最短路径问题 【双重权值问题】
- HDU 3790 最短路径问题 (双重权值)
- HDU 3790 最短路径问题 (双重权值) dp
- HDU 3790 最短路径问题 双重权值
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- HDU--3790:最短路径问题 (Dijkstra算法)
- 最短路径问题 HDU杭电3790 【Dijkstra算法】
- HDU 3790 最短路径问题 (Dijkstra算法)
- hdu 3790 最短路径问题 dijkstra算法
- 最短路径 Dijkstra 算法 HDU 3790
- HDU 3790 ——最短路径问题 以边表为数据结构的BF算法&双重权值
- HDU 3790 最短路径问题(Dijkstra)
- HDU--3790最短路径问题 【Dijkstra】
- hdu 1874 畅通工程续
- spring aop中的propagation的7种配置的意思
- hdu 2112 HDU Today (最短路)
- poj 2312 Battle City(优先队列+bfs)
- hdu 1548 A strange lift (dijkstra算法)
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
- hdu 1217 Arbitrage (spfa算法)
- poj 2387 Til the Cows Come Home(dijkstra算法)
- hdu 2066 一个人的旅行
- poj 1062 昂贵的聘礼 (dijkstra最短路)
- poj 2253 Frogger (dijkstra最短路)
- CxImage的编译及简单使用举例
- hdu 1233 还是畅通工程 (最小生成树)
- hdu 2680 Choose the best route (dijkstra算法 最短路问题)