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) 收藏 举报