#include<iostream>
#include<algorithm>
using namespace std;
int maze[55][55];
int city[55];
int path[55][55]; //路径
int n; //城市数
void input()
{
int i, j, w;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf_s("%d", &maze[i][j]);
if (maze[i][j] == -1) maze[i][j] = 10000000;
path[i][j] = j;
}
for (i = 1; i <= n; i++)
scanf_s("%d", &city[i]);
return;
}
void floyd()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (maze[i][j] > maze[i][k] + maze[k][j] + city[k])
{
maze[i][j] = maze[i][k] + maze[k][j] + city[k];
path[i][j] = path[i][k];
}
else if (maze[i][j] == maze[i][k] + maze[k][j] + city[k])
{
if (path[i][j] > path[i][k])
{
path[i][j] = path[i][k];
}
}
}
}
}
}
void print_path(int u, int v) //u是起点v是终点
{
int k;
if (u == v)
{
printf("%d", v);
return;
}
k = path[u][v];
printf("%d-->", u);
print_path(k, v);
}
int main()
{
while (cin >> n && n)
{
input();
floyd(); //先算出来距离
int b, e;
while (cin >> b >> e )
{
if (b == -1 && e == -1) break;
int cost = maze[b][e];
if (b == e) //起点和终点相同
{
printf("From %d to %d :\n", b, e);
printf("Path: %d\n", b);
printf("Total cost : %d\n\n", cost);
continue;
}
printf("From %d to %d :\n", b, e);
printf("Path: ");
print_path(b, e);
printf("\n");
printf("Total cost : %d\n\n", cost);
}
}
return 0;
}
HDU1385
最新推荐文章于 2021-02-23 11:19:38 发布