题意:找出图中的一个点,使m个点到这个点的时间相同。
题记:由于每个路径都是1,所以可以用bfs做,把所有起点存入队列,记录下这个点的深度和遍历的次数,当有一个点遍历了m次则输出。
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;
const int N=2e5+10;
int e[N*2],ne[N*2],h[N*2],idx;
int deep[N],vis[N],num[N];
int n,m;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
queue<int>q;
void bfs(){
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=h[x];i!=-1;i=ne[i]){
int to=e[i];
if(deep[to]==0||deep[to]==deep[x]+1){
num[to]+=num[x];
deep[to]=deep[x]+1;
if(num[to]==m){
cout<<"YES"<<endl<<to<<endl;
exit(0);
}
if(!vis[to]){
q.push(to);
vis[to]=1;
}
}
}
}
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof(h));
for(int i=0;i<n-1;i++){
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
int x;
for(int i=0;i<m;i++){
cin>>x;
q.push(x);
deep[x]=1;
vis[x]=1;
num[x]=1;
}
if(m==1){
cout<<"YES"<<endl<<x<<endl;;
return 0;
}
bfs();
cout<<"NO"<<endl;
return 0;
}