hdu 3790 最短路径问题(双重权值,dijkstra算法)
2014-08-14 17:16
344 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790
题目大意:题意明了,输出最短路径及其花费。
需要注意的几点:(1)当最短路径相同时,输出最小花费!!!
(2)更新路径的时候要注意更新花费。
一种简单明了的代码。
View Code
题目大意:题意明了,输出最短路径及其花费。
需要注意的几点:(1)当最短路径相同时,输出最小花费!!!
(2)更新路径的时候要注意更新花费。
#include <iostream> #include <cstdio> using namespace std; const int INF=9999999; int map[1010][1010],Min,n,cost[1010][1010],node[1010],vis[1010]; int pr[1010]; void set() { for (int i=1; i<=n; i++) { vis[i]=0; node[i]=INF; pr[i]=INF; for (int j=1; j<=n; j++) { map[i][j]=INF; cost[i][j]=INF; } } } void dijkstra(int m) { int tm=m; vis[m]=1; node[m]=0; pr[m]=0; for (int k=2; k<=n; k++) { Min=INF; int M=INF; for (int i=1; i<=n; i++) if(!vis[i]) { if (node[i]>map[tm][i]+node[tm]) { node[i]=map[tm][i]+node[tm]; pr[i]=cost[tm][i]+pr[tm]; } else if(node[i]==map[tm][i]+node[tm]) { if(pr[i]>cost[tm][i]+pr[tm]) { node[i]=map[tm][i]+node[tm]; pr[i]=cost[tm][i]+pr[tm]; } } if (Min>node[i]) { M=pr[i]; Min=node[i]; m=i; } else if (Min==node[i]) { if(M>pr[i]) { M=pr[i]; Min=node[i]; m=i; } } } vis[m]=1; tm=m; } } int main () { int a,b,d,p,m; while(scanf("%d%d",&n,&m),n||m) { set(); while (m--) { scanf("%d%d%d%d",&a,&b,&d,&p); if (map[a][b]>d) { cost[a][b]=cost[b][a]=p; map[a][b]=map[b][a]=d; } else if (map[a][b]==d) { if (cost[a][b]>p) cost[a][b]=cost[b][a]=p; } } scanf("%d%d",&a,&b); dijkstra(a); printf ("%d %d\n",node[b],pr[b]); } }
一种简单明了的代码。
#include <iostream> #include <cstdio> using namespace std; const int INF=9999999; int Map[1010][1010],Min,Mmin,n,cost[1010][1010],node[1010],vis[1010]; int pr[1010],tm; void sett() { for (int i=1; i<=n; i++) { node[i]=INF; vis[i]=0; pr[i]=INF; for (int j=1; j<=n; j++) { Map[i][j]=INF; cost[i][j]=INF; } } } int dijkstra() { for (int i=1; i<=n; i++) { Min=INF; Mmin=INF; for (int j=1; j<=n; j++) { if (!vis[j]) { if (Min>node[j]) { Min=node[j]; Mmin=pr[j]; tm=j; } else if (Min==node[j]) { if (Mmin>pr[j]) { Mmin=pr[j]; tm=j; } } } } vis[tm]=1; for (int j=1; j<=n; j++) if (!vis[j]) { if (node[j]>Map[tm][j]+node[tm]) { node[j]=Map[tm][j]+node[tm]; pr[j]=cost[tm][j]+pr[tm]; } else if (node[j]==Map[tm][j]+node[tm]) { if (pr[j]>cost[tm][j]+pr[tm]) { node[j]=Map[tm][j]+node[tm]; pr[j]=cost[tm][j]+pr[tm]; } } } } } int main () { int m,a,b,d,p,s,t; while (~scanf("%d%d",&n,&m)) { if (n==0&&m==0) break; sett(); for (int i=1; i<=m; i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if (Map[a][b]>d) { Map[a][b]=Map[b][a]=d; cost[a][b]=cost[b][a]=p; } else if (Map[a][b]==d) { if (cost[a][b]>p) cost[a][b]=cost[b][a]=p; } } scanf("%d%d",&s,&t); node[s]=0; pr[s]=0; dijkstra(); printf ("%d %d\n",node[t],pr[t]); } }
View Code
相关文章推荐
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
- HDU 3790 最短路径问题(双重Dijkstra算法)
- HDU 3790 最短路径问题 双重权值
- HDU 3790 最短路径问题 (双重权值) dp
- HDU-3790 最短路径问题(双重权值)
- HDU 3790 ——最短路径问题 以边表为数据结构的BF算法&双重权值
- HDU 3790 最短路径问题 (双重权值)
- HDU 3790 简单最短路径问题(dijkstra+双重权值)
- HDU 3790 最短路径问题 【双重权值问题】
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU 3790 最短路径问题(单源最短路---Dijkstra算法)
- HDU 3790.最短路径问题【最短路径Dijkstra算法】【4月14】
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- hdu 3790 最短路径问题 dijkstra算法
- hdu-3790-最短路径问题(dijkstra算法)
- HDU 3790 最短路径问题【最短路 dijkstra 双权值】
- [HDU] 3790 最短路径问题-一条边有两种权值
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)