#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1000005;
const int P=20;
int tot,dep[N],head[N],tov[N],nex[N],anc[N][P+1];
void add(int x,int y)
{
tot++;
tov[tot]=y;
nex[tot]=head[x];
head[x]=tot;
}
void dfs(int u,int f)
{
anc[u][0]=f;
for(int i=1;i<=P;i++)
anc[u][i]=anc[anc[u][i-1]][i-1];
for(int i=head[u];i;i=nex[i])
{
int v=tov[i];
if(v==f) continue;
dep[v]=dep[u]+1;
dfs(v,u);
}
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int t=dep[u]-dep[v];
for(int i=0;t;t>>=1,i++)
if(t&1) u=anc[u][i];
if(u==v) return u;
for(int i=P;i>=0;i--)
if(anc[u][i]!=anc[v][i])
u=anc[u][i],v=anc[v][i];
return anc[u][0];
}
int main()
{
int n,root,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
root=s;
dep[root]=1;
dfs(root,root);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
cout<<lca(x,y)<<endl;
}
return 0;
}
//求dfs序
/*void dfs(int u, int f) {
++dd;
seq[dd]=u;
in[u]=dd;
for(int t = head[u]; t; t = last[t]) {
int v = dest[t];
if(v == f) continue;
dfs(v, u);
}
out[u]=dd;
}*/
某蒟蒻的lca板子(某谷居然t掉了)
lca板子
最新推荐文章于 2022-07-27 11:38:27 发布