0分求助!
查看原帖
0分求助!
535996
Blanc_min楼主2022/6/3 11:00
#include<bits/stdc++.h>
using namespace std;
int n,m,s,f[500001][21],d[500005];
bool bj[500005];
struct bb{
    int son[1001],tot,f;
}tree[500005];
int root (int x) {return tree[x].f==0?x:root(tree[x].f);}
void dfs(int x,int fa) {
    bj[x]=1;
    for(int i=1;i<=tree[x].tot;i++) {
        int v=tree[x].son[i];
        if(bj[v]==0&&v) {
            f[v][0]=x,d[v]=d[x]+1;
            for(int w=1;w<=20;w++) f[v][w]=f[f[v][w-1]][w-1];
            dfs(v,x);
        }
    }
}
int lca(int x,int y) {
    if(d[y]>d[x]) swap(x,y);
    for(int i=19;i>=0;i--) {
        if(f[x][i]!=0&&d[f[x][i]]>=d[y]) {
            x=f[x][i];
        }
    }
    //cout<<x<<' '<<y<<endl;
    if(x==y) return x;
    for(int i=19;i>=0;i--) {
        if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    }
    return f[x][0]; 
}
int main() {
    cin>>n>>m>>s;
    for(int i=1;i<n;i++) {
        int x,y;
        cin>>x>>y;
        // int u=++tree[x].tot;
        // tree[x].son[u]=y;
        int u=++tree[y].tot;
        tree[y].son[u]=x;
        tree[x].f=y;
    }
    int t=root(1);
    d[0]=-1;
    dfs(t,0);
    // for(int i=1;i<=n;i++) {
    //     for(int j=0;j<=5;j++) {
    //         cout<<f[i][j]<<' ';
    //     }
    //     cout<<endl;
    // }
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        cout<<lca(x,y)<<endl;
    }
    return 0;
}
2022/6/3 11:00
加载中...