全re求助
查看原帖
全re求助
613526
LDY_楼主2024/10/24 21:40

rt 应当是一些愚蠢的问题

#include<bits/stdc++.h>
using namespace std;
int t;
int f[200005];
int n,m;
struct Edge{
	int u,v;
}edge[400005];
struct node{
	int v,nxt;
}e[400005];
int head[200005],cnt;
void add(int u,int v){
	cnt++;
	e[cnt].v=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int findx(int x){
	if(x==f[x]) return x;
	return f[x]=findx(f[x]);
}
int merge(int x,int y){
	int a=findx(x);
	int b=findx(y);
	if(a!=b) f[a]=b;
}
int vis[200005];
int ans[200005];
int siz[200005];
int fa[200005];
int u,v;
void dfs(int u,int ff){
	siz[u]=1;fa[u]=ff;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==ff) continue;
		dfs(v,u);
		siz[u]+=siz[v];
	}
}
void getans(int u,int fa){
	ans[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==fa) continue;
		getans(v,u);
	}
}

int main(){
	cin>>t;
	while(t--){
		scanf("%d%d",&n,&m);
		cnt=0;
		int num=0;
		for(int i=1;i<=m;i++){
			vis[i]=0;
			scanf("%d%d",&edge[i].u,&edge[i].v);
		}
		for(int i=1;i<=n;i++){
			f[i]=i;
			ans[i]=0;
			siz[i]=0;
			head[i]=0;
			fa[i]=0;
		} 
		
		for(int i=1;i<=m;i++){
			int u=edge[i].u,v=edge[i].v;
			if(findx(u)!=findx(v)){
				vis[i]=1;
				add(u,v);
				add(v,u);
				merge(u,v);
				num++;
			}
		}
		if(num!=n-1){
			cout<<-1<<endl;
			continue;
		}
		dfs(1,0);
		bool flag=0;
		for(int i=1;i<=m;i++){
			if(!vis[i]){
				if(siz[edge[i].u]<siz[edge[i].v])getans(edge[i].u,fa[edge[i].u]);
				else getans(edge[i].v,fa[edge[i].v]);
				flag=1;
				break;
			}
		}
		if(!flag){
			cout<<-1<<endl;
			continue;
		}
		for(int i=1;i<=n;i++){
			if(ans[i]==1) cout<<"W";
			else cout<<"B";
		}
		cout<<endl;
	}
}
2024/10/24 21:40
加载中...