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

导航