tarjan100分wa求调
查看原帖
tarjan100分wa求调
970932
Kaury楼主2024/3/28 20:50
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+4;
int n,m,rt,vis[N],ans[N],f[N],u,v;
vector<int> e[N],id[N],qr[N];
int find(int x){
	return f[x]==x ? x : f[x]=find(f[x]);
} 
inline void Add(int u,int v,int cnt){
	id[u].emplace_back(cnt);
	id[v].emplace_back(cnt);
	qr[u].emplace_back(v);
	qr[v].emplace_back(u);
}
void tarjan(int x){
	vis[x]=1;
	for(int i : e[x]){
		if(!vis[i]){
			tarjan(i);
			f[i]=x;
		}
	}
	for(int i=0;i<qr[x].size();++i){
		int k=qr[x][i],cnt=id[x][i];
		if(vis[k]==2){
			ans[cnt]=find(k);
		}
	}
	vis[x]=2;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL); 
	cin>>n>>m>>rt;
	for(int i=1;i<=n;++i) f[i]=i;
	for(int i=1;i<n;++i){
		cin>>u>>v;
		e[u].emplace_back(v);
		e[v].emplace_back(u);
	}
	for(int i=1;i<=m;++i){
		cin>>u>>v;
		Add(u,v,i);
	}
	tarjan(rt);
	for(int i=1;i<=n;++i) cout<<ans[i]<<"\n";
	return 0;
}

码风可能不太好,请见谅

2024/3/28 20:50
加载中...