hdu1385 floyed最短路(记录路径)

 1 #include<stdio.h>
 2 #include<string.h>
 3 int g[105][105],next[105][105],v[105];
 4 int main()
 5 {
 6     int n,i,j,a,b,k,flag;
 7     while (~scanf("%d",&n)&&n)
 8     {
 9         for (i=1;i<=n;i++)
10             for (j=1;j<=n;j++)
11             {
12                 scanf("%d",&g[i][j]);
13                 if (g[i][j]==-1) g[i][j]=0x3f3f3f3f;
14                 next[i][j]=j;
15               if (i==j) g[i][j]=0;
16             }
17         for (i=1;i<=n;i++) scanf("%d",&v[i]);
18         for (k=1;k<=n;k++)
19             for (i=1;i<=n;i++)
20                 for (j=1;j<=n;j++)
21                 if (g[i][k]+g[k][j]+v[k]<g[i][j])
22         {
23             g[i][j]=g[i][k]+g[k][j]+v[k];
24             next[i][j]=next[i][k];
25         }
26             else if (g[i][k]+g[k][j]+v[k]==g[i][j])
27             next[i][j]=next[i][k]<next[i][j]?next[i][k]:next[i][j];
28         while (~scanf("%d%d",&a,&b)&&(a!=-1&&b!=-1))
29         {
30             flag=a;
31             printf("From %d to %d :\n",a,b);
32             printf("Path: %d",a);
33             while (flag!=b) {printf("-->%d",next[flag][b]); flag=next[flag][b]; }
34             printf("\nTotal cost : %d\n\n",g[a][b]);
35         }
36     }
37 }

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

posted on 2014-09-04 20:46  xiao_xin  阅读(102)  评论(0编辑  收藏  举报

导航