比较简单的一个题,但题目描述搞得比较混乱。
题意:先输入19行,每行先是一个数字J,接着跟着J个数字,输入的每个数字x表示行数i与x两点是联通的(且距离为1)。随后再输入一个数字n,紧跟着n行,每行输入一个出发点和目的地点,输出两个点之间的最小距离。
直接用Floyd算法套模板搞定。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int vis[21][21];
const int INF = 50;
void floyd()
{
for(int k=1; k<=20; k++)
for(int i=1; i<=20; i++)
for(int j=1; j<=20; j++)
vis[i][j] = min(vis[i][j], vis[i][k] + vis[k][j]);
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
int num, x, y, cas = 0;
while(scanf("%d", &num) != EOF)
{
for(int i=1; i<21; i++)
for(int j=1; j<21; j++)
{
if(i == j)
vis[i][j] = 0;
else
vis[i][j] = INF;
}
for(int j=0; j<num; j++)
{
scanf("%d", &x);
vis[1][x] = vis[x][1] = 1;
}
for(int i=2; i<20; i++)
{
scanf("%d", &num);
for(int j=0; j<num; j++)
{
scanf("%d", &x);
vis[i][x] = vis[x][i] = 1;
}
}
floyd();
scanf("%d", &num);
printf("Test Set #%d\n", ++cas);
for(int i=0; i<num; i++)
{
scanf("%d%d", &x, &y);
printf( "%2d to %2d: %d\n", x, y, vis[x][y]);
}
puts("");
}
return 0;
}