蒟蒻树剖0分求助
查看原帖
蒟蒻树剖0分求助
535996
Blanc_min楼主2023/1/12 08:31

RT

#include<bits/stdc++.h>
using namespace std;
#define ll int
ll tot,f[100001],p[100001],n,m,s;
struct bb {
    ll deep,fa,son[101],tot,v,mx,top;
}tree[100001];
void dfs1(ll x,ll f,ll d) {
    tree[x].fa=f;
    tree[x].deep=d;
    for(ll i=1;i<=tree[x].tot;i++) {
        ll t=tree[x].son[i];
        if(t!=f) {
            dfs1(t,x,d+1);
            tree[x].v+=tree[t].v;
            if(tree[t].v>tree[tree[x].mx].v) tree[x].mx=t;
        }
    }
}
void dfs2(ll x,ll t) {
    f[x]=++tot;
    tree[x].top=t;
    p[tot]=x;
    if(tree[x].tot==0) return;
    dfs2(tree[x].mx,t);
    for(ll i=1;i<=tree[x].tot;i++) {
        ll r=tree[x].son[i];
        if(r!=tree[x].fa&&r!=tree[x].mx) {
            dfs2(r,r);
        }
    }
}
int main() {
    scanf("%d%d%d" ,&n ,&m ,&s);
    for(ll i=1;i<n;i++) {
        ll x,y;
        scanf("%d%d" ,&x ,&y);
        ll u=++tree[x].tot;
        tree[x].son[u]=y;
        u=++tree[y].tot;
        tree[y].son[u]=x;
    }
    dfs1(s,0,1);
    dfs2(s,s);
    for(ll i=1;i<=m;i++) {
        ll x,y;
        scanf("%d%d" ,&x ,&y);
        while(tree[x].top!=tree[y].top) {
            if(tree[x].deep>=tree[y].deep) x=f[tree[x].top];
            else y=f[tree[y].top];
        }
        printf("%d\n" ,tree[x].deep<tree[y].deep?x:y);
    }
    return 0;
}
2023/1/12 08:31
加载中...