染色
https://www.acwing.com/problem/content/4493/
题意就是给你每个点的父节点的编号,初始颜色是0,然后把每个点颜色给你,每一次染色都可以把其及其子树染成和它一样的,问变成对应的颜色至少需要操作多少次
树啥的好像没有我想的那么复杂...
我也不清楚,还是多做做题然后思考思考吧
这个题我还是有点想复杂了
这个题有两种做法:
不建树:
因为每个根节点(父节点)染色,对应的子树颜色都是一样的,如果遍历到某个点的颜色和父节点的颜色不同,就需要操作一次(这是必然的)
就虽然没有实现染色的这个操作,但事实上,染过色之后子树和根节点的颜色是一样的,但现在不一样了,说明需要执行一次操作了
#include<iostream> using namespace std; const int N=2e6+10; int p[N],c[N]; int main(){ int n; cin>>n; for(int i=2;i<=n;i++) cin>>p[i]; for(int i=1;i<=n;i++) cin>>c[i]; int res=0; for(int i=1;i<=n;i++)//遍历每个点,看看每个点的颜色和父节点的颜色是否一样 { if(c[i]!=c[p[i]]) res++; } cout<<res<<"\n"; return 0; }
建树:
#include<iostream> #include<cstring> using namespace std; const int N=2e6+10; int h[N],e[N],ne[N],idx,c[N]; void add(int a,int b) { e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } int dfs(int u,int w) { int res=(c[u]!=w); for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; res+=dfs(j,c[u]); } return res; } int main(){ memset(h,-1,sizeof(h)); int n; cin>>n; for(int i=2;i<=n;i++) { int p; cin>>p; add(p,i);//树是有向图 } for(int i=1;i<=n;i++) cin>>c[i]; cout<<dfs(1,0); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具