//BFS经典题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define MAX 10000
#define INF 1000000
using namespace std;
int nz,nr; // 地区数目,路线数目
int mz[MAX];//mz[i]编号i地区相邻地区的数目
int edge[MAX][10]; //edge[i][j]表示编号i地区第j个相邻地区的编号
int reach[MAX]; //reach[s]==cur表示地区s在第cur+1站已访问
int res[MAX];//res[i]表示每条线路上每个地区到地区i距离中的最大值
int cur,mr;
void BFS(int s)
{
int i,a,b;
int val,at;
queue<int> q[2];
a=0,b=1,val=0;
if(reach[s]<cur)
{
q[b].push(s);
reach[s]=cur;
res[s]=max(res[s],val+1);
}
while(!q[b].empty())
{
swap(a,b);
val++;
while(!q[a].empty())
{
at=q[a].front();
q[a].pop();
for(i=0; i<mz[at]; i++)
{
if(reach[edge[at][i]]<cur)
{
q[b].push(edge[at][i]);
reach[edge[at][i]]=cur;
res[edge[at][i]]=max(res[edge[at][i]],val+1);
}
}
}
}
}
int main()
{
int T;
int i,j;
int id;
scanf("%d",&T);
while(T--)
{
cur=0;
memset(reach,-1,sizeof(reach));
memset(res,0,sizeof(res));
scanf("%d %d",&nz,&nr);
for(i=0; i<nz; i++)
{
scanf("%d",&id);
scanf("%d",&mz[id]);
for(j=0; j<mz[id]; j++) scanf("%d",&edge[id][j]);
}
for(i=0; i<nr; i++)
{
scanf("%d",&mr);
for(j=0; j<mr; j++)
{
scanf("%d",&id);
BFS(id);
cur++;
}
}
int ret=INF;
int center=-1;
for(i=0; i<10000; i++)
{
if(reach[i]==cur-1&&res[i]<ret)
{
ret=res[i];
center=i;
}
}
printf("%d %d\n",ret,center);
}
return 0;
}
本文详细解析了一道经典的BFS算法题目,包括输入参数解释、核心算法流程、实例演示及输出结果分析。

1292

被折叠的 条评论
为什么被折叠?



