Tarjan Hack 求调
查看原帖
Tarjan Hack 求调
804794
NPCaaabc楼主2023/11/2 19:51
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int n,m,s;
vector<int> G[514514];
vector<pii> ask[514514];
int ans[514514];
bool vis[514514];

int fa[514514];
int find(int p) {
    if(fa[p] == p) return p;
    return fa[p] = find(fa[p]);
}
void dfs(int u,int f){
    fa[u] = u;vis[u] = 1;
    for(auto v : G[u]) if(v!=f) dfs(v,u);
    for(auto v : ask[u]) {
        int to = v.first,id = v.second;
        if(to==f) continue;
        if(vis[to]) ans[id] = find(to);
    }
    fa[u] = f;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<n;i++) {
        int x,y;scanf("%d%d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(int i=1;i<=m;i++) {
        int a,b;scanf("%d%d",&a,&b);
        ask[a].push_back(make_pair(b,1));
        ask[b].push_back(make_pair(a,1));
    }
    dfs(s,s);
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}
2023/11/2 19:51
加载中...