先输入19行,每行先是一个数字J,接着跟着J个数字,输入的每个数字x表示行数i与x两点是联通的(且距离为1)。随后再输入一个数字n,紧跟着n行,每行输入一个出发点和目的地点,输出两个点之间的最小距离。
直接用Floyd算法套模板搞定。
#include<stdio.h>
#include<string.h>
const int INF = 1000;
int map[21][21];
int main(){
int a,b;
int i,j,k;
int cnt = 0;
while(scanf("%d",&a)!=EOF){
for(i = 1;i<21;i++){
for(j = 1;j<21;j++) {
if(i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
for(i = 1;i<=a;i++) {
scanf("%d",&b);
map[1][b] = map[b][1] = 1;
}
for(i = 2;i<=19;i++){
scanf("%d",&a);
for(j = 1;j<=a;j++){
scanf("%d",&b);
map[i][b] = map[b][i] = 1;
}
}
for(k = 1;k<=20;k++){
for(i = 1;i<=20;i++){
for(j = 1;j<=20;j++){
if(map[i][j]>map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
}
}
int t;
scanf("%d",&t);
printf("Test Set #%d\n",++cnt);
while(t--){
scanf("%d%d",&a,&b);
printf("%2d to %2d: %d\n",a,b,map[a][b]);
}
printf("\n");
}
return 0;
}