题目大意:给定n个城市,及其之间的距离,然后有一行数,代表在每个城市中所需要的过路费。求任意两点间的
最小费用,及其经过的路径。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int Map[1000][1000],n,path[1000][1000],b[1000];
void Floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(Map[i][j]>Map[i][k]+Map[k][j]+b[k])
{
Map[i][j]=Map[i][k]+Map[k][j]+b[k];
path[i][j]=path[i][k];//更新路径
}
else if(Map[i][j]==Map[i][k]+Map[k][j]+b[k])
{
path[i][j]=min(path[i][k],path[i][j]);
}
}
}
int main()
{
int m,i,j,k,x,y;
while(~scanf("%d",&n))
{
if(!n) break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&k);
if(k==-1)
Map[i][j]=inf;
else
{
Map[i][j]=k;path[i][j]=j;//用path[][]数组记录下某个当前路径
}
}
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
Floyd();int tmp;
while(~scanf("%d%d",&x,&y))
{
if(x==-1&&y==-1)
break;
tmp=path[x][y];
printf("From %d to %d :\n",x,y);
printf("Path: %d",x);
if(x==y)
printf("\nTotal cost : %d\n\n",Map[x][y]);
else
{
while(1)
{
printf("-->%d",tmp);
if(tmp==y) break;
tmp=path[tmp][y];
}
printf("\nTotal cost : %d\n\n",Map[x][y]);
}
}
}
return 0;
}