题意:有20个城镇,然后给出了城镇之间的连通情况,要求输出从给出的起点到终点之间最少经过多少个城镇。
题解:最短路径问题,把每个城镇之间的距离当做1,经过的城镇数量就可以根据计算最短路径得出。用的floyd算法。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 25;
const int INF = 0x3f3f3f3f;
int que, t = 1, g[N][N], num[N];
void floyd() {
for (int k = 1; k <= 20; k++)
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= 20; j++)
if (g[i][j] > g[i][k] + g[k][j]) {
g[i][j] = g[i][k] + g[k][j];
}
}
int main() {
while (scanf("%d", &num[1]) != EOF) {
int a;
memset(g, INF, sizeof(g));
for (int i = 1; i <= num[1]; i++) {
scanf("%d", &a);
g[1][a] = g[a][1] = 1;
}
for (int i = 2; i < 20; i++) {
scanf("%d", &num[i]);
for (int j = 1; j <= num[i]; j++) {
scanf("%d", &a);
g[i][a] = g[a][i] = 1;
}
}
floyd();
scanf("%d", &que);
printf("Test Set #%d\n", t++);
int sta, end;
while (que--) {
scanf("%d%d", &sta, &end);
printf("%2d to %2d: %d\n", sta, end, g[sta][end]);
}
printf("\n");
}
return 0;
}