#include<bits/stdc++.h>
using namespace std;
#define N 100005
vector<int> v[N];
int son[N];//重儿子是哪个
int top[N];//当前重链头;
int nid[N];//dfs序
int deep[N];//深度
int f[N];//父亲
int sizee[N];
int dfs_id;
void dfs1(int x,int fa)
{
f[x]=fa;
son[x]=0;
sizee[x]=1;
deep[x]=deep[fa]+1;
for(int i=0;i<v[x].size();i++)
{
int to=v[x][i];
if(to==fa)
continue;
dfs1(to,x);
sizee[x]+=sizee[to];
if(sizee[son[x]]<sizee[to])
son[x]=to;
}
return ;
}
void dfs2(int x,int topx)
{
top[x]=topx;
nid[x]=++dfs_id;
if(son[x]!=0)
dfs2(son[x],topx);
for(int i=0;i<v[x].size();i++)
{
int to=v[x][i];
if(to!=son[x]&&to!=f[x])
dfs2(to,to);
}
return ;
}
int lca(int a,int b)
{
while(top[a]!=top[b])
{
if(deep[top[b]]>=deep[top[a]])
{
b=f[top[b]];
}
else
a=f[top[a]];
}
return deep[a]>deep[b]?b:a;
}
int main()
{
int n,m,s;
cin>>n>>m>>s;
for(int i=0;i<n-1;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(s,0);
dfs2(s,s);
while(m--)
{ int a,b;
cin>>a>>b;
cout<<lca(a,b)<<endl;
}
}
树连剖分求LCA
最新推荐文章于 2024-06-15 16:17:24 发布