UVA - 567 Risk(Floyd)
題目大意:有20個城市,輸入給19行,每行先給有幾個數,然後接着給出這幾個數,代表的是後面的城市編號和行編號(城市編號)有一條邊,每條邊的權值爲1.接着m個查詢任意兩個城市之間的最短距離。
解題思路:求任意兩個頂點之間的距離,用floyd。
代碼:
#include <cstdio>
const int maxn = 21;
const int INF = 0x3f3f3f3f;
int G[maxn][maxn];
void Floyd () {
for (int k = 1; k < maxn; k++)
for (int i = 1; i < maxn; i++)
for (int j = 1; j < maxn; j++)
if (G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[j][i] = G[i][k] + G[k][j];
}
int main () {
int n, m, u, v, cas = 0;
while (scanf ("%d", &n) != EOF) {
for (int i = 1; i < maxn; i++)
for (int j = 1; j < maxn; j++)
G[i][j] = (i == j) ? 0 : INF;
for (int i = 0; i < n; i++) {
scanf ("%d", &v);
G[1][v] = G[v][1] = 1;
}
for (int i = 2; i < 20; i++) {
scanf ("%d", &n);
for (int j = 0; j < n; j++) {
scanf ("%d", &v);
G[i][v] = G[v][i] = 1;
}
}
Floyd();
scanf ("%d", &m);
printf ("Test Set #%d\n", ++cas);
while (m--) {
scanf ("%d%d", &u, &v);
printf ("%2d to %2d: %d\n", u, v, G[u][v]);
}
printf ("\n");
}
return 0;
}