倍增80
查看原帖
倍增80
371927
REAL_曼巴楼主2023/2/12 23:00
#include<iostream>
using namespace std;
const int maxn=500010;
int head[maxn],to[maxn<<1],nxt[maxn<<1],lg[maxn],fa[maxn][21],depth[maxn],idx;
void add(int u,int w){
    to[idx]=w;
    nxt[idx]=head[u];
    head[u]=idx++;
}
void dfs(int now,int fath){
    depth[now]=depth[fath]+1;
    fa[now][0]=fath;
    for(int i=1;i<=20;++i){
        fa[now][i]=fa[fa[now][i-1]][i-1];
    }
    for(int i=head[now];i;i=nxt[i]){
        if(to[i]!=fath)dfs(to[i],now);
    }
}
int lca(int x,int y){
    if(depth[x]<depth[y])swap(x,y);
    while(depth[x]>depth[y]){
        x=fa[x][lg[depth[x]-depth[y]]-1];
    }
    if(x==y)return x;
    for(int k=lg[depth[x]]-1;k>=0;--k){
        if(fa[x][k]!=fa[y][k])x=fa[x][k],y=fa[y][k];
    }
    return fa[x][0];
}
int main(){
    int n,q,s;
    cin>>n>>q>>s;
    for(int i=1;i<=n;++i)lg[i]=lg[i-1]+(1<<lg[i-1]==i);
    for(int i=1;i<=n-1;++i){
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    dfs(s,0);
    while(q--){
        int x,y;
        cin>>x>>y;
        cout<<lca(x,y)<<endl;
    }
    return 0;
}

求调谢谢

2023/2/12 23:00
加载中...