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