rt,思路是用tarjan算法使用并查集来做,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,s,fa[N],ans[N];
vector<pair<int,int>> query[N];
vector<int> e[N];
bool vis[N];
void init(){
//初始化并查集
for (int i=1;i<=n+1;i++){
fa[i]=i;
}
}
int find(int u){
//查找并查集
if (u==fa[u]){
return u;
}
return fa[u]=find(fa[u]);
}
void tarjan(int u){
//init();
vis[u]=true;
for (auto v:e[u]){
if (!vis[v]){
//没访问过
tarjan(v);
fa[v]=u;
}
}
for (auto q:query[u]){
int v=q.first;
int i=q.second;
if (vis[v]) {
//-- question --
//大概是这里,但是我不确定
ans[i]=find(v);
//cout<<find(v)<<" 114514"<<endl;
}
}
}
int main(){
init();
cin>>n>>m>>s;
for (int i=1;i<=n-1;i++){
int a,b;
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
for (int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
query[a].push_back({b,i});
query[b].push_back({a,i});
}
tarjan(s);
for (int i=1;i<=m;i++){
cout<<ans[i]<<endl;
}
return 0;
}