经典的BFs题目。
从公交车路线经过的每一个城市a出发,搜索到达其他城市b所需要的 阀值c,则城市b到达城市a最小的阀值为res[b]=c.
然后保存每次搜索中的最小值中的最大值,就是某一个城市覆盖所有公交路线的最小阀值了。
#include <queue>
#include <vector>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int nz,nr,num[10000];
vector<int>vec[10000];
int idd[10000];//用这个数组记录第几层。
int res[10000];//记录某一个城市覆盖当前点以及以前的点的最大值
void bfs(int k)
{
queue<int>que;
que.push(k);
res[k]=max(res[k],1);
idd[k]=1;
while(!que.empty())
{
int t=que.front();
que.pop();
for(int i=0;i<vec[t].size();i++)
{
if(!idd[vec[t][i]])
{
idd[vec[t][i]]=idd[t]+1;
que.push(vec[t][i]);
res[vec[t][i]]=max(res[vec[t][i]],idd[t]+1);
}
}
}
}
int main()
{
int cas,mzi,k,h;
cin>>cas;
while(cas--)
{
memset(res,0,sizeof(res));
cin>>nz>>nr;
for(int i=0;i<nz;i++)
{
cin>>num[i]>>mzi;
vec[num[i]].clear();
while(mzi--)
{
cin>>k;
vec[num[i]].push_back(k);
}
}
while(nr--)
{
cin>>k;
while(k--)
{
memset(idd,0,sizeof(idd));
cin>>h;
bfs(h);
}
}
int sum=10000,id=0;
for(int i=0;i<nz;i++)
if(res[num[i]]<sum||(res[num[i]]==sum&&num[i]<id))
{
sum=res[num[i]];
id=num[i];
}
cout<<sum<<" "<<id<<endl;
}
return 0;
}