tarjan100 WA subtask3求调
查看原帖
tarjan100 WA subtask3求调
635829
D_FANG楼主2024/10/23 18:41
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1e5;
struct bcj{
    int f[N];
    int get(int x){
        if (x==f[x]) return x;
        return f[x]=get(f[x]);
    }
    int query(int x,int y){
        return get(x)==get(y);
    }
    void insert(int x,int y){
        f[get(x)]=get(y);
    }
    void memsets(int n){
        for (int i=1;i<=n;++i) f[i]=i;
    }
}t;
struct rec{
    int e,nex;
}z[N*2];
int en,fi[N];
void add(int s,int e){
    z[++en].e=e;
    z[en].nex=fi[s];
    fi[s]=en;
}
int n,m,rt;
vector<int>id[N],cp[N];
int ans[N];
void query_id(int s,int e,int i){
    id[s].push_back(i);id[e].push_back(i);
    cp[s].push_back(e);cp[e].push_back(s);
}
void init(){
    scanf("%d%d%d",&n,&m,&rt);
    for (int i=1;i<n;++i){
        int s,e;
        scanf("%d%d",&s,&e);
        add(s,e);add(e,s);
    }
    for (int i=1;i<=m;++i){
        int s,e;
        scanf("%d%d",&s,&e);
        query_id(s,e,i);
    }
    t.memsets(n);
}
int vis[N];
void tarjan(int x,int fa){
    vis[x]=1;
    for (int i=fi[x];i!=0;i=z[i].nex){
        if (z[i].e==fa) continue;
        tarjan(z[i].e,x);
        t.insert(z[i].e,x);
    }
    int len=cp[x].size();
    int u,lca;
    for (int i=0;i<len;++i){
        u=cp[x][i];
        if (vis[u]!=2) continue;
        lca=t.get(u);
        if (ans[id[x][i]]!=0) continue; 
        ans[id[x][i]]=lca;
    }
	vis[x]=2;
}
void print(){
    for (int i=1;i<=m;++i) printf("%d\n",ans[i]);
}
int main(){
    init();
    tarjan(rt,0);
    print();
    return 0;
}
2024/10/23 18:41
加载中...