题意:这题的输入是真你妹儿的坑爹啊~ 让我调这么久。。。就是各个城镇边权都是1,最后求a to b 的最短距离dist[a][b]
思路:Floyd
#include<iostream>
#define inf 1000000
using namespace std;
int dist[23][23];
void floyd()
{
int i,j,k;
for(k=1;k<=20;k++)
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
dist[i][j]=dist[i][k]+dist[k][j];
return ;
}
int main()
{
int i,j,sp,ep,k,a,n,h=1;
while(scanf("%d",&k)!=EOF)//while(1)也WA,题里说了得用EOF格式的输入..坑爹。。。
{
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
dist[i][j]=inf;
for(j=1;j<=k;j++)
{
scanf("%d",&a);
dist[1][a]=1;
dist[a][1]=1;
}
for(i=2;i<=19;i++)
{
scanf("%d",&k);
for(j=1;j<=k;j++)
{
scanf("%d",&a);
dist[i][a]=1;
dist[a][i]=1;
}
}
floyd();
scanf("%d",&n);
printf("Test Set #%d\n",h++);
for(i=1;i<=n;i++)
{
scanf("%d%d",&sp,&ep);
printf("%d to %d: %d\n",sp,ep,dist[sp][ep]);
}
printf("\n");
}
//system("pause");
}