求助
查看原帖
求助
1120455
wudihuoyingdawang楼主2024/6/21 12:50
#include <bits/stdc++.h>
using namespace std;
const int N=5e6,DEP=20;
int cnt,a,b,n,m,root,head[2*N],old[N][DEP+1],deep[N];
struct Node{
    int to,next;
}edge[2*N];
void in(){
    for(int i=0;i<2*n;i++){
      edge[i].next=-1;
    	head[i]=-1;
    }
    return;
}
void add_Node(int  u,int v){
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=++cnt;
    return;
}
void dfs(int x,int dad){
    deep[x]=deep[dad]+1;
    old[x][0]=dad;
    for(int i=1;pow(2,i)<=deep[x];i++){
        old[x][i]=old[old[x][i-1]][i-1];
    }
    for(int i=head[x];i!=-1;i=edge[i].next){
        if(edge[i].to!=dad){
            dfs(edge[i].to,x);
        }
    }
    return;
}
int get_LCA(int x,int y){
    if(deep[x]<deep[y]) swap(x,y);
    for(int i=DEP;i>=0;i--){
        if(deep[x]-pow(2,i)>=deep[y]){
            x=old[x][i];
        }
    }
    if(x==y) return y;
    for(int i=DEP;i>=0;i--){
    	if(old[x][i]!=old[y][i]){
       		x=old[x][i];
        	y=old[y][i];
    	}
    }
    return old[x][0];
}
int main(){
    in();
    scanf("%d %d %d\n",&n,&m,&root);
    for(int i=1;i<n;i++){
        scanf("%d %d\n",&a,&b);
        add_Node(a,b);
        add_Node(b,a);
    }
    dfs(root,0);
    for(int i=1;i<=m;i++){
        scanf("%d %d\n",&a,&b);
        printf("%d\n",get_LCA(a,b));
    }
    return 0;
}
2024/6/21 12:50
加载中...