根据题意可以知道叶子结点必须要和他的父亲节点颜色相同,不是叶子节点的节点,而且还没有染色,也让他们和它的父亲同色,如果此时他的父亲已经染过色了那么他就没办法染色了,如果根节点孤寡,也不能染色。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int tot,n;
struct node{
int t;
int next;
}edage[maxn<<1];
int head[maxn];
void addedage(int x,int y){
edage[++tot].t=y;
edage[tot].next=head[x];
head[x]=tot;
}
int f[maxn];// ran se or not
int flag=false;
int cnt=0;
int col[maxn];
void dfs(int node,int fa){
int son=0;
for(int i=head[node];i!=-1;i=edage[i].next){
if(edage[i].t==fa)continue;
son++;
dfs(edage[i].t,node);
}
if(son==0||f[node]==0){
if(f[fa]!=0){
flag=true;
return ;
}
f[node]=f[fa]=++cnt;
}
}
void dfs2(int node,int fa){
for(int i=head[node];i!=-1;i=edage[i].next){
if(edage[i].t==fa)continue;
if(f[node]==f[edage[i].t]) col[edage[i].t]=col[node];
else col[edage[i].t]=col[node]^1;
dfs2(edage[i].t,node);
}
}
int main(){
cin>>n;
memset(head,-1,sizeof(head));
memset(edage,-1,sizeof(edage));
for(int i=1;i<n;i++){
int t1,t2;
cin>>t1>>t2;
addedage(t1,t2);
addedage(t2,t1);
}
dfs(1,0);
if(flag==true||f[0]!=0){
cout<<-1<<endl;
return 0;
}
col[1]=1;
dfs2(1,0);
for(int i=1;i<=n;i++){
if(col[i]==1)cout<<"R";
else cout<<"B";
}
return 0;
}


京公网安备 11010502036488号