蒟蒻的模板

快要爆零了敲些模板复习复习,随缘更新

P3379 【模板】最近公共祖先(LCA)

#include<bits/stdc++.h>
using namespace std;
const int size=500010;
int n,m,t,f[size][25],root;
int head[size],ver[2*size],Next[2*size],d[size],tot;
queue<int>q;
void add(int x,int y){
    ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
void bfs(){
    q.push(root);d[root]=1;
    while(q.size()){
        int x=q.front();q.pop();
        for(int i=head[x];i;i=Next[i]){
            int y=ver[i];
            if(d[y]) continue;
            d[y]=d[x]+1;
            f[y][0]=x;
            for(int j=1;j<=t;++j){
                f[y][j]=f[f[y][j-1]][j-1];
            }
            q.push(y);
        }
    }
}
int lca(int x,int y){
    if(d[x]>d[y]) swap(x,y);
    for(int i=t;i>=0;i--){
        if(d[f[y][i]]>=d[x]){
            y=f[y][i];
        } 
    }
    if(x==y) return x;
    for(int i=t;i>=0;i--){
        if(f[y][i]!=f[x][i]){
            y=f[y][i];
            x=f[x][i];
        }
    }
    return f[x][0];
}
int main(){
    scanf("%d %d %d",&n,&m,&root);
    t=((int)(log(n)/(log(2))))+1;
    for(int i=1;i<n;++i){
        int x,y;
        scanf("%d %d",&x,&y);
        add(x,y);add(y,x);
    }
    bfs();
    for(int i=1;i<=m;++i){
        int x,y;
        scanf("%d %d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/donkey2603089141/p/11819120.html
今日推荐