#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<iostream>
#define N 1000050
#define INF 1000000001
using namespace std;
int d[106][106];
int pre[106][106];
int a[106];
int main() {
int i,j,k,n;
while(scanf("%d",&n)&&n)
{
memset(pre,-1,sizeof(pre));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&d[i][j]);
if(d[i][j]==-1)
d[i][j]=INF;
}
}
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
pre[i][j]=j;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==k||j==k)continue;
if(d[i][j]>d[i][k]+d[k][j]+a[k])
{
d[i][j]=d[i][k]+d[k][j]+a[k];
pre[i][j]=pre[i][k];
}
else if(d[i][j]==d[i][k]+d[k][j]+a[k]&&pre[i][j]>pre[i][k])
{
pre[i][j]=pre[i][k];
}
}
}
}
int start,end;
while(scanf("%d%d",&start,&end))
{
if(start==-1&&end==-1)break;
int now=pre[start][end];
printf("From %d to %d :\n",start,end);
if(start==end)
printf("Path: %d\n",start,end);
else
{
printf("Path: %d",start);
while(true)
{
printf("-->%d",now);
if(now==end)break;
now=pre[now][end];
}
puts("");
}
printf("Total cost : %d\n\n",d[start][end]);
}
}
}
zoj 1456
最新推荐文章于 2019-08-10 22:04:00 发布