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

来源:互联网 发布:淘宝背景音乐推荐 编辑:程序博客网 时间:2024/05/22 10:35
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 

题目大意:题意明了,输出最短路径及其花费。

需要注意的几点:(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 }
View Code

 

0 0