HDU 1385--最短路 记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1385

题意:有N个城市,已知每两个城市间的距离花费,以及经过每个城市需要收取的税金。然后若干组输入,每组输入是 起点s和终点t, 输出从s到t的最小费用路径,并输出最小费用。最小费用路径有多条时,输出字典序最小的。
floyd 算法。

这题参照了网上的代码,记录路径的方法挺巧,第一次写记录路径的题目。

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define INF 0x3f3f3f3f
 5 #define maxn 1005
 6 int path[maxn][maxn],g[maxn][maxn],cost[maxn],n;
 7 void floyd()
 8 {
 9     int i,j,k;
10     for(i=1;i<=n;i++)
11         for(j=1;j<=n;j++)
12             path[i][j]=j;
13     for(k=1;k<=n;k++)
14         for(i=1;i<=n;i++)
15             for(j=1;j<=n;j++)
16             {
17                 int s=g[i][k]+g[k][j]+cost[k];
18                 if(g[i][j]>s)
19                     g[i][j]=s,path[i][j]=path[i][k];
20                 else if(g[i][j]==s&&path[i][j]>path[i][k])
21                     path[i][j]=path[i][k];
22             }
23 }
24 int main()
25 {
26     int i,j,a,b;
27     while(scanf("%d",&n),n)
28     {
29         for(i=1;i<=n;i++)
30             for(j=1;j<=n;j++)
31             {
32                 scanf("%d",&g[i][j]);
33                 if(g[i][j]==-1)
34                     g[i][j]=0x3f3f3f3f;
35             }
36         for(i=1;i<=n;i++)
37             scanf("%d",&cost[i]);
38         floyd();
39         while(scanf("%d %d",&a,&b),a!=-1&&b!=-1)
40         {
41             printf("From %d to %d :\n",a,b);
42             printf("Path: %d",a);
43             int xx=a;
44             while(xx!=b)
45             {
46                 printf("-->%d",path[xx][b]);
47                 xx=path[xx][b];
48             }
49             printf("\nTotal cost : %d\n\n",g[a][b]);
50         }
51     }
52     return 0;
53 }
复制代码

 

posted on 2013-02-04 20:28  acoderworld  阅读(157)  评论(0)    收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示