You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.6 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1003;
2 years ago
int g[N][N], path[N][N]; // 邻接矩阵、路径
int n, x, y, cost[N]; // 额外费用
2 years ago
void floyd() {
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
2 years ago
if (g[i][k] != INF)
2 years ago
for (int j = 1; j <= n; j++) {
2 years ago
if (g[i][j] > g[i][k] + g[k][j] + cost[k]) {
g[i][j] = g[i][k] + g[k][j] + cost[k];
2 years ago
path[i][j] = path[i][k];
}
2 years ago
if (g[i][j] == g[i][k] + g[k][j] + cost[k]) {
2 years ago
if (path[i][j] > path[i][k]) // 字典序
path[i][j] = path[i][k];
}
}
}
int main() {
while (cin >> n && n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
path[i][j] = j;
2 years ago
cin >> g[i][j];
if (g[i][j] == -1) g[i][j] = INF;
2 years ago
}
}
for (int i = 1; i <= n; i++) cin >> cost[i];
floyd();
while (cin >> x >> y) {
if (x == -1 && y == -1) break;
printf("From %d to %d :\n", x, y);
printf("Path: %d", x);
2 years ago
int u = x, v = y;
2 years ago
while (x != y) {
printf("-->%d", path[x][y]);
x = path[x][y];
}
2 years ago
puts("");
2 years ago
2 years ago
if (g[u][v] < INF)
printf("Total cost : %d\n", g[u][v]);
2 years ago
else
2 years ago
puts("-1");
puts("");
2 years ago
}
}
return 0;
}