#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define re register
#define inl inline
#define LL long long
const int MAX=500000;
int n,m,s;
int dep[MAX+5],f[MAX+5][23],ans;
int h[MAX+5],nxt[2*MAX+5],to[2*MAX+5],num_Edge;
inl void add_sth(int x,int y)
{
to[++num_Edge]=y;
nxt[num_Edge]=h[x];
h[x]=num_Edge;
}
void DFS(int now,int fa)
{
dep[now]=dep[fa]+1;
for(re int i=0;i<=19;i++)
f[now][i+1]=f[f[now][i]][i];
for(re int i=h[now];i;i=nxt[i])
{
int k=to[i];
if(k==fa) continue;
f[k][0]=now;
DFS(k,now);
}
}
inl int find_LCA(int x,int y)
{
for(re int i=20;i>=0;i--)
{
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(x==y) return x;
}
for(re int i=20;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
int u,v;
scanf("%d%d%d",&n,&m,&s);
for(re int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add_sth(u,v);
add_sth(v,u);
}
DFS(s,0);
while(m--)
{
scanf("%d%d",&u,&v);
if(dep[u]<dep[v]) std::swap(u,v);
ans=find_LCA(u,v);
printf("%d\n",ans);
}
return 0;
}
模板---------LCA(最近公共祖先)
最新推荐文章于 2024-06-02 13:59:55 发布