原题如下(原题地址https://www.patest.cn/contests/gplt/L3-008)
输入样例:
7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7
输出样例:
2
6
4
0
乍一看题目貌似就是简单的BFS,但其实存在环的情况如
1-2
| |
4-3
这种四元环情况,则1最远到达的山头为三,故只需记录到达的层数,以及对访问过的结点进行标记即可,
笔者给出代码如下
#include "bits/stdc++.h"
using namespace std;
int main()
{
int n=0,m=0,k=0;
cin>>n>>m>>k;
int n1=0,n2=0;
vector<int>p[10005];
for(int i=0; i<m; i++)
{
cin>>n1>>n2;
p[n1].push_back(n2);
p[n2].push_back(n1);
}
int key=0;
queue<int>num;
for(int i=0; i<k; i++)
{
cin>>key;
int visit[10005]= {0};//标记访问过的山头
int level[10005]= {0};//山头对于歌声源山头的距离
num.push(key);
visit[key]=1;
level[key]=1;
while(!num.empty())
{
int sump=0;
for(int j=0; j<p[num.front()].size(); j++)
{
int tmp=p[num.front()][j];
if(visit[tmp]!=1)
{
visit[tmp]=1;
num.push(tmp);
level[tmp]=level[num.front()]+1;
}
}
num.pop();
}
int tmpl=level[1],ans=1;
for(int j=2; j<n+1; j++)
{
if(level[j]>tmpl)
{
tmpl=level[j];
ans=j;
}
}
if(ans==key)
cout<<0<<endl;
else
cout<<ans<<endl;
}
}
测试结果如下