RE求助
查看原帖
RE求助
481937
Gen_shin楼主2024/11/6 20:01
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans[400005];
struct edge{
	int left,right;
	bool lf,rf;
}a[400005];
int u[400005];
int v[400005];
int fa[400005];
vector<int> g[400005];
void init(){
	for(int i=1;i<=n;i++){
		fa[i]=i;
		a[i].lf=a[i].rf=0;
	}
} 
int _find(int x){
	if(x<=0){
		return 0;
	}
	if(x==fa[x]){
		return x;
	}
	return fa[x]=_find(fa[x]);
}
int unite(int x,int y){
	x=_find(x);
	y=_find(y);
	if(x!=y&&x!=-1&&y!=-1){
		fa[x]=y;
	}
}
void dfs(int x,int w){
	ans[x]=w;
	for(int i=0;i<g[x].size();i++){
		if(!ans[g[x][i]]){
			dfs(g[x][i],w);
		}
	}
}
int main(){
	cin>>n>>m;
	init();
	for(int i=1;i<=n;i++){
		cin>>a[i].left>>a[i].right;
	}
	for(int i=1,op;i<=m;i++){
		cin>>u[i]>>op;
		if(op==1){
			a[u[i]].lf=1;
			v[i]=a[u[i]].left;
		}else{
			a[u[i]].rf=1;
			v[i]=a[u[i]].right;
		}
	}
	for(int i=1;i<=n;i++){
		if(!a[i].lf&&a[i].left!=-1){
			g[i].push_back(a[i].left);
			g[a[i].left].push_back(i);
			unite(i,a[i].left);
		}
		if(!a[i].rf&&a[i].right!=-1){
			g[i].push_back(a[i].right);
			g[a[i].right].push_back(i);
			unite(i,a[i].right);
		}
	}
	for(int i=1;i<=n;i++){
		if(_find(i)==_find(1)){
			ans[i]=-1;
		}
	}
	for(int i=m;i>=1;i--){
		if(u[i]==-1||v[i]==-1){
			continue;
		}
		unite(u[i],v[i]);
		g[u[i]].push_back(v[i]);
		g[v[i]].push_back(u[i]);
		if(_find(u[i])==_find(1)&&!ans[u[i]]){
			dfs(u[i],i-1);
		}
		if(_find(v[i])==_find(1)&&!ans[v[i]]){
			dfs(v[i],i-1);
		}
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
}
2024/11/6 20:01
加载中...