题意:
一个游戏,有 20 个城市,编号为 1 - 20 ,有一些道路,连接两个城市,求从一个城市到另一个城市
要经过的最小道路个数。
分析:
Floyd 算法,求任意两点之间的最短路。
代码:
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int INF = 1000;
int main()
{
int d[25][25];
int x, y, n, k;
int cas = 1;
while(~scanf("%d", &n))
{
for(int i = 0; i < 25; i++) //初始化所有两点间距离为无穷大
for(int j = 0; j < 25; j++)
d[i][j] = INF;
for(int i = 0; i < n; i++) //与 1 号城市相连的城市
{
scanf("%d", &k);
d[1][k] = d[k][1] = 1;
}
for(int i = 2; i < 20; i++) //与 2 - 19 号城市相连的城市
{
scanf("%d", &n);
for(int j = 0; j < n; j++)
{
scanf("%d", &k);
d[i][k] = d[k][i] = 1;
}
}
for(int k = 1; k <= 20; k++) //更新两城市间的最短路
for(int i = 1; i <= 20; i++)
for(int j = 1; j <= 20; j++)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
printf("Test Set #%d\n", cas++);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x, &y);
printf("%2d to %2d: %d\n", x, y, d[x][y]);
}
printf("\n");
}
return 0;
}