|
|
@ -4,17 +4,17 @@ const int INF = 0x3f3f3f3f;
|
|
|
|
|
|
|
|
|
|
|
|
const int N = 1003;
|
|
|
|
const int N = 1003;
|
|
|
|
int g[N][N], path[N][N]; // 邻接矩阵、路径
|
|
|
|
int g[N][N], path[N][N]; // 邻接矩阵、路径
|
|
|
|
int n, x, y, cost[N]; // 额外费用
|
|
|
|
int n, x, y, w[N]; // 额外费用
|
|
|
|
void floyd() {
|
|
|
|
void floyd() {
|
|
|
|
for (int k = 1; k <= n; k++)
|
|
|
|
for (int k = 1; k <= n; k++)
|
|
|
|
for (int i = 1; i <= n; i++)
|
|
|
|
for (int i = 1; i <= n; i++)
|
|
|
|
if (g[i][k] != INF)
|
|
|
|
if (g[i][k] != INF)
|
|
|
|
for (int j = 1; j <= n; j++) {
|
|
|
|
for (int j = 1; j <= n; j++) {
|
|
|
|
if (g[i][j] > g[i][k] + g[k][j] + cost[k]) {
|
|
|
|
if (g[i][j] > g[i][k] + g[k][j] + w[k]) {
|
|
|
|
g[i][j] = g[i][k] + g[k][j] + cost[k];
|
|
|
|
g[i][j] = g[i][k] + g[k][j] + w[k];
|
|
|
|
path[i][j] = path[i][k];
|
|
|
|
path[i][j] = path[i][k];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (g[i][j] == g[i][k] + g[k][j] + cost[k]) {
|
|
|
|
if (g[i][j] == g[i][k] + g[k][j] + w[k]) {
|
|
|
|
if (path[i][j] > path[i][k]) // 字典序
|
|
|
|
if (path[i][j] > path[i][k]) // 字典序
|
|
|
|
path[i][j] = path[i][k];
|
|
|
|
path[i][j] = path[i][k];
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -24,12 +24,12 @@ int main() {
|
|
|
|
while (cin >> n && n) {
|
|
|
|
while (cin >> n && n) {
|
|
|
|
for (int i = 1; i <= n; i++) {
|
|
|
|
for (int i = 1; i <= n; i++) {
|
|
|
|
for (int j = 1; j <= n; j++) {
|
|
|
|
for (int j = 1; j <= n; j++) {
|
|
|
|
path[i][j] = j;
|
|
|
|
path[i][j] = j; // 路径初始化,如果i->j有边,则记录path[i][j]=j,就是记录i->j的中间节点
|
|
|
|
cin >> g[i][j];
|
|
|
|
cin >> g[i][j];
|
|
|
|
if (g[i][j] == -1) g[i][j] = INF;
|
|
|
|
if (g[i][j] == -1) g[i][j] = INF;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (int i = 1; i <= n; i++) cin >> cost[i];
|
|
|
|
for (int i = 1; i <= n; i++) cin >> w[i];
|
|
|
|
floyd();
|
|
|
|
floyd();
|
|
|
|
|
|
|
|
|
|
|
|
while (cin >> x >> y) {
|
|
|
|
while (cin >> x >> y) {
|
|
|
@ -37,13 +37,13 @@ int main() {
|
|
|
|
printf("From %d to %d :\n", x, y);
|
|
|
|
printf("From %d to %d :\n", x, y);
|
|
|
|
printf("Path: %d", x);
|
|
|
|
printf("Path: %d", x);
|
|
|
|
int u = x, v = y;
|
|
|
|
int u = x, v = y;
|
|
|
|
|
|
|
|
// 用循环打印路径
|
|
|
|
while (x != y) {
|
|
|
|
while (x != y) {
|
|
|
|
printf("-->%d", path[x][y]);
|
|
|
|
printf("-->%d", path[x][y]);
|
|
|
|
x = path[x][y];
|
|
|
|
x = path[x][y];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
puts("");
|
|
|
|
puts("");
|
|
|
|
|
|
|
|
|
|
|
|
if (g[u][v] < INF)
|
|
|
|
if (g[u][v] < INF)
|
|
|
|
printf("Total cost : %d\n", g[u][v]);
|
|
|
|
printf("Total cost : %d\n", g[u][v]);
|
|
|
|
else
|
|
|
|
else
|
|
|
|