//在UVALive - 5269 过不去
Output Limit Exceeded |
Length |
---|
#include<iostream>
#include<cstdio>
#include<climits>
#include<string.h>
using namespace std;
const int N = 1000+5;
int Next[N][N];
int dist[N][N];
int a[N];
const int inf = 0x3f3f3f3f;
int n;
void Floyd()
{
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(dist[i][j] > dist[i][k]+dist[k][j]+a[k]){
dist[i][j] = dist[i][k]+dist[k][j]+a[k];
Next[i][j] = Next[i][k];//i到j的下一个节点为k,即i的下一个节点为k
}
else if((dist[i][j] == dist[i][k]+dist[k][j]+a[k]) && (Next[i][j] > Next[i][k])){
Next[i][j] = Next[i][k];
}
// cout << i << "----->" << j << ":" << Next[i][j] << endl;
}
}
}
}
int main()
{
while(cin >> n && n){
memset(Next, 0, sizeof(Next));
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
cin >> dist[i][j];
Next[i][j] = j;
if(dist[i][j] == -1){
dist[i][j] = inf;
// cout << dist[i][j] << " :";
// dist[i][j] = INT_MAX;//INT_MAX会大于inf但会出错,尚未明白
// cout << dist[i][j] << endl;
}
}
}
for(int i=1; i<=n; i++){
cin >> a[i];
}
Floyd();
int x, y;
while(cin >> x >> y && (x != -1 || y != -1)){
cout << "From " << x << " to " << y << " :" << endl;
cout << "Path: " << x;
int tmp = dist[x][y];
while(x != y){
cout << "-->" << Next[x][y];
x = Next[x][y];
}
cout << endl;
cout << "Total cost : " << tmp << endl<< endl;
}
}
return 0;
}