Minimum Transport Cost
这道题我从下午两点开始做,一开始时dijkstra算法做的,做到后面才悲剧地发现,我根本无法正确记录路径,悲剧啊。。。想了一阵子还是没有想出方法,想到想到竟然睡着了。。
最后想起了, floyd 算法。。不得不删了重新再写一次。。。。用floyd算法写的时侯,参考了下小白的,最后测试数据全通过了。。没想到提交wa..最后检查了好久还发现输出total cost时侯,我用的是map[a][b],,而a已经改变了。但是测试数据竟然能完全通过。。amazing..
#include<stdio.h> #include<stdlib.h> #include<string.h> int map[120][120],dp[120][120],cost[120],a,b,N; const int inf=0x7fffffff; int min(int x,int y) { return x<y?x:y; } void Floyd( ) { int t,k,i,j,l; for(k=1;k<=N;k++) { for(i=1;i<=N;i++) { for(j=1;map[i][k]!=inf&&j<=N;j++) { if(map[k][j]!=inf) { t=map[i][k]+map[k][j]+cost[k]; if(map[i][j]>t) { map[i][j]=t; dp[i][j]=dp[i][k]; } if(t==map[i][j]) dp[i][j]=min(dp[i][j],dp[i][k]); } } } } l=a; printf("From %d to %d :\n",a,b); if(a==b) printf("Path: %d\n",a); else { printf("Path: %d-->",a); while(dp[a][b]!=b) { printf("%d-->",dp[a][b]); a=dp[a][b]; } printf("%d\n",b); } printf ("Total cost : %d\n\n", map[l][b]); } int main( ) { int i,j,k,p,t; while(scanf("%d",&N),N) { for(i=1;i<=N;i++) for(j=1;j<=N;j++) { scanf("%d",&t); dp[i][j]=j; if(t==-1) map[i][j]=inf; else map[i][j]=t; } for(i=1;i<=N;i++) scanf("%d",&cost[i]); while(1) { scanf("%d%d",&a,&b); if(a==-1&&b==-1) break; Floyd( ); } } return 0; }
posted on 2011-05-01 17:46 more think, more gains 阅读(316) 评论(0) 编辑 收藏 举报