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 阅读(325) 评论(0) 收藏 举报
浙公网安备 33010602011771号