UVA - 567 Risk

题目大意:固定有 20 个点,然后输入 19 行的数据,每一行先输入一个n,表示该行还有 n 个数,然后输入 n 个数,表示每个数与该行的序号数相同的点有连接,并且权值为 1, 在数入 m,表示有 m 次询问,每个询问包含两个数值 a , b,输出 a~b 间的最短路径


解题思路:Floyd算法

#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;
}


你可能感兴趣的:(UVA - 567 Risk)