80分代码求调
查看原帖
80分代码求调
250097
BaYueXiang楼主2022/9/25 12:36
#include<bits/stdc++.h>
using namespace std;
int n,m,s,deep[500001],h[500001],fa[500001][20];//point question root
struct node {
    int v,next;
}edge[1000002]; 
void ae (int a,int u,int v) {
    edge[a].v=v;
    edge[a].next=h[u];
    h[u]=a;
    return;
}
void dfs (int u,int lfa) {
    for (int a=h[u];a;a=edge[a].next) {
        int v=edge[a].v;
        if (v==lfa) continue;
        deep[v]=deep[u]+1;
        fa[v][0]=u;
        for (int b=1;(1<<b)<=deep[u];b++) fa[v][b]=fa[fa[v][b-1]][b-1];
        dfs(v,u);
    }
}
int lca (int x,int y) {
    if (deep[x]>deep[y]) swap(x,y);
    for (int a=19;a>=0;a--) if (deep[x]<=deep[y]-(1<<a)) y=fa[y][a];
    if (x==y) return x;
    for (int a=19;a>=0;a--) {
        if (fa[x][a]==fa[y][a]) continue;
        else {
            x=fa[x][a];
            y=fa[y][a];
        }
    }
    return fa[x][0];
}
int main () {
    cin >>n>>m>>s;
    for (int a=1;a<n;a++) {
        int x,y;
        cin >>x>>y;
        ae(2*a-2,x,y);
        ae(2*a-1,y,x);
    }
    deep[s]=1;
    dfs(s,0);
    for (int a=1;a<=m;a++) {
        int x,y;
        cin >>x>>y;
        cout <<lca(x,y)<<endl;
    }
    return 0;
}
2022/9/25 12:36
加载中...