思路:
和L2-026小字辈那题很像,读取每一对互相连通的山都建一个双向边,即a->b和b->a,然后对于每次询问BFS一下。BFS时遍历点的所有边,边另一边的山如果没被搜过就入队,每搜到一个山就把经过的距离和编号的负值(题目要求的顺序)放入set,最后取set的最后一个元素就是所要求的点。
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
#include<queue>
#include<set>
using namespace std;
typedef pair<int,int> PII;
int n,k,m,a,b,que;
int h[10010],ne[1000010],e[1000010],idx;
int st[10010];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs(int x){
set<PII> ans;
queue<PII> q;
q.push({0,-x});
st[x]=1;
while(!q.empty()){
int root=-q.front().second;
int cnt=q.front().first;
q.pop();
ans.insert({cnt,-root});
for(int i=h[root];i!=-1;i=ne[i]){
if(!st[e[i]]){
q.push({cnt+1,-e[i]});
st[e[i]]=1;
}
}
}
if((*ans.rbegin()).first) return -(*ans.rbegin()).second;
else return 0;
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
cin>>a>>b;
add(a,b);
add(b,a);
}
while(k--){
cin>>que;
cout<<bfs(que)<<endl;
memset(st,0,sizeof st);
}
system("pause");
}