一、题目描述:
给你一颗
将这
求是否存在一种颜色序列,使得染色之后可以变成现在的颜色序列。
如果不存在,输出
二、解题思路:
设染色后的
设染色前的
我们将
然后暴力统计即可,注意两个点:
没什么好讲的,因为本来这个题就不难。
三、完整代码:
1 #include<iostream> 2 #define N 200010 3 using namespace std; 4 string s; 5 int T,n,u1,v1; 6 int c[N],du[N],tot[N],ans[N]; 7 struct EDGE{ 8 int v,nxt; 9 }edge[N*2]; 10 int head[N],cnt; 11 void add(int u,int v) 12 { 13 edge[++cnt].v=v; 14 edge[cnt].nxt=head[u]; 15 head[u]=cnt; 16 } 17 int dfs(int u,int ff) 18 { 19 for(int i=head[u];i!=-1;i=edge[i].nxt) 20 if(edge[i].v!=ff) 21 { 22 if(!dfs(edge[i].v,u)) 23 return 0; 24 if(ans[edge[i].v]==-1) 25 ans[edge[i].v]=c[u]; 26 if(ans[edge[i].v]==c[u]) 27 tot[u]++; 28 } 29 if(tot[u]*2<du[u]) 30 { 31 if(ans[ff]==-1) ans[ff]=c[u]; 32 if(!ff||tot[u]*2+2<du[u]||ans[ff]!=c[u]) 33 return 0; 34 } 35 return 1; 36 } 37 void solve() 38 { 39 cin>>n;cnt=0; 40 for(int i=1;i<=n;i++) 41 head[i]=ans[i]=-1,du[i]=tot[i]=0; 42 for(int i=1;i<n;i++) 43 { 44 cin>>u1>>v1; 45 add(u1,v1),du[u1]++; 46 add(v1,u1),du[v1]++; 47 } 48 cin>>s; 49 for(int i=0;i<n;i++) 50 c[i+1]=s[i]=='W'; 51 if(!dfs(1,0)) 52 { 53 cout<<-1<<'\n'; 54 return ; 55 } 56 for(int i=1;i<=n;i++) 57 ans[i]?cout<<"W":cout<<"B"; 58 cout<<'\n'; 59 } 60 int main() 61 { 62 ios::sync_with_stdio(false); 63 cin.tie(0);cout.tie(0); 64 cin>>T; 65 for(int i=1;i<=T;i++) 66 solve(); 67 return 0; 68 }
四、写题心得:
我突然发现这根本就不是什么心得,而是我的吐槽。
这次
所以是
不过问题不大。加油吧!拜拜!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】