floyd + 保存路径
#include <bits/stdc++.h>
using namespace std;
#define N 0x3f3f3f3f
int e[1010][1010],pre[1010][1010];
int num[1010];
int n;
void calculate();
void output(int s,int t);
int main()
{
int i,j,s,t;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&e[i][j]);
if(e[i][j]==-1) e[i][j]=N;
pre[i][j]=j;
}
}
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
calculate();
while(scanf("%d%d",&s,&t)!=EOF)
{
if(s==-1&&t==-1) break;
printf("From %d to %d :\n",s,t);
printf("Path: %d",s);
output(s,t);
printf("\n");
printf("Total cost : %d\n\n",e[s][t]);
}
}
return 0;
}
void calculate()
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(e[i][j]>e[i][k]+e[k][j]+num[k])
{
e[i][j]=e[i][k]+e[k][j]+num[k];
pre[i][j]=pre[i][k];
}
else if(e[i][j]==e[i][k]+e[k][j]+num[k])
{
if(pre[i][j]>pre[i][k])
{
pre[i][j]=pre[i][k];
}
}
}
}
}
return;
}
void output(int s,int t)
{
if(s==t) return;
printf("-->%d",pre[s][t]);
output(pre[s][t],t);
return;
}