倍增LCA0pts求调
查看原帖
倍增LCA0pts求调
529458
Butterfly___qwq楼主2023/10/20 12:22
#include<iostream>
#define int long long
using namespace std;
int nxt[1000001],to[1000001],head[1000001],pre[25][1000001],dep[1000001],p2[1000001];
int cnt;
void add(int u,int v){
    nxt[++cnt]=head[u];
    to[cnt]=v;
    head[u]=cnt;
}
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    pre[0][u]=fa;
    for(int i=1;i<=24;i++)pre[i][u]=pre[i-1][pre[i-1][u]];
    for(int i=head[u];i;i=nxt[i]){
        if(to[i]!=fa){
            dfs(to[i],u);
        }
    }
}
int lca(int u,int v){
    if(dep[u]>dep[v])swap(u,v);
    for(int i=24;i>=0;i--){
        if(dep[v]-p2[i]>=dep[u]){
            v=pre[i][v];
        }
    }
    if(u==v){
        return u;
    }
    for(int i=24;i>=0;i--){
    	if(pre[u][0]==pre[v][0])continue;
        else if(pre[i][v]!=pre[i][u]){
            v=pre[i][v],u=pre[i][u];
        }
    }
    return pre[v][0];
}
signed main(){
    int n,m,s;
    cin>>n>>m>>s;
    p2[0]=1;
    for(int i=1;i<=100001;i++)p2[i]=p2[i-1]*2;
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(s,0);
    while(m--){
        int u,v;
        cin>>u>>v;
        cout<<lca(u,v)<<endl;
    }
}//
/*
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
*/
2023/10/20 12:22
加载中...