题目大意:固定有 20 个点,然后输入 19 行的数据,每一行先输入一个n,表示该行还有 n 个数,然后输入 n 个数,表示每个数与该行的序号数相同的点有连接,并且权值为 1, 在数入 m,表示有 m 次询问,每个询问包含两个数值 a , b,输出 a~b 间的最短路径
#include <cstdio> #include <cstring> int main() { int n, x, y, cnt = 0, d[25][25]; while (scanf("%d", &n) != EOF) { memset(d, 0x3f3f, sizeof(d)); while (n--) { scanf("%d", &y); d[1][y] = d[y][1] = 1; } for (x = 2; x < 20; x++) { scanf("%d", &n); while (n--) { scanf("%d", &y); d[x][y] = d[y][x] = 1; } } for (int k = 1; k <= 20; k++) for (int i = 1; i <= 20; i++) for (int j = 1; j <= 20; j++) if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j]; scanf("%d", &n); printf("Test Set #%d\n", ++cnt); 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; }