#include <iostream>
#include <cstdio>
#define MAX 1005
#define INF 10000000
using namespace std;
int d[MAX][MAX];
int path[MAX][MAX]; //路径
int cost[MAX];
void floyd(int n)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
path[i][j]=j;
int k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
int temp=d[i][k]+d[k][j]+cost[k];
if(d[i][j]>temp)
{
d[i][j]=temp;
path[i][j]=path[i][k];
}
if(d[i][j]==temp)
{
if(path[i][k]<path[i][j])
path[i][j]=path[i][k];
}
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n),n!=0)
{
int i,j;
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",&cost[i]);
floyd(n);
int a,b;
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
int xx=a;
printf("From %d to %d :\n",a,b);
printf("Path: %d",a);
while(xx!=b)
{
printf("-->%d",path[xx][b]);
xx=path[xx][b];
}
printf("\n");
printf("Total cost : %d\n\n",d[a][b]);
}
}
return 0;
}
hdu 1385 floyd 最短路
最新推荐文章于 2021-03-25 10:06:02 发布