根据题意可以知道叶子结点必须要和他的父亲节点颜色相同,不是叶子节点的节点,而且还没有染色,也让他们和它的父亲同色,如果此时他的父亲已经染过色了那么他就没办法染色了,如果根节点孤寡,也不能染色。
#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; }