lca求调有关注
查看原帖
lca求调有关注
371927
REAL_曼巴楼主2021/11/21 09:53
#include<cstdio>
#include<algorithm>
using namespace std; 
struct node{
    int t;
    int nxt;
};
node e[1000005];
int head[1000005];
int top;
int loog[1001];
void add(int x,int y){
    e[++top].t=y,e[top].nxt=head[x],head[x]=top;
}
int dep[1000005];
int f[1000005][21]; 
void dfs(int now,int fa){
    f[now][0]=fa,dep[now]=dep[fa]+1;
    for(int i=1;i<=20;i++)f[now][i]=f[f[now][i-1]][i-1];
    for(int i=head[now];i;i=e[i].nxt)if(e[i].t!=fa)dfs(e[i].t,now);
}
int lca(int x,int y){
    if(dep[x]<dep[y])swap(x,y);
    while(dep[x]>dep[y])x=f[x][loog[dep[x]-dep[y]]-1];
    if(x==y)return x;
    for(int k=loog[dep[x]]-1;k>=0;k--)if(f[x][k]!=f[y][k])x=f[x][k],y=f[y][k];
    return f[x][0];
}
void init (int n){for(int i=1;i<=n;i++)loog[i]=loog[i-1]+(1<<loog[i-1]==i);return;}
int main(){
    
    int n,m,s;
    init(n);
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n-1;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y),add(y,x);
    }
    
    dfs(s,0);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}

30分,全mle

2021/11/21 09:53
加载中...