Description

给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根、内部结点和叶子均可)着以黑色或白色。你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身)。

对于每个叶结点u,定义 c [ u ] c[u] c[u] 为从 u u u 到根结点的简单路径上第一个有色结点的颜色。给出每个 c [ u ] c[u] c[u] 的值,设计着色方案,使得着色结点的个数尽量少。

Solution

先给出一个结论:对于任意一个可行根,对答案没有影响。

  • 证明:设当前根为 x x x,有一与其相连的 y y y 。若 x x x 和 y y y 都有颜色,则可以得出 x x x 和 y y y 颜色必然不同(否则就不是最优解),因此根从 x x x 到 y y y 不会对答案有影响。

那么根据这个结论,不妨随便找一个根。

考虑树形 d p dp dp。设 f i , 0 / 1 / 2 f_{i,0/1/2} fi,0/1/2​ 表示当前节点 i i i 涂 0,1 或者不涂。

先考虑有颜色的。转移分为叶子结点和非叶节点。

对于 f i , 0 f_{i,0} fi,0​,如果 s o n son son 是叶子节点并且要 1 ,那么 f i , 0 + 1 f_{i,0}+1 fi,0​+1。如果是非叶节点, f i , 0 = ∑ min ⁡ ( min ⁡ ( f s o n , 0 − 1 , f s o n , 1 ) , f s o n , 2 ) f_{i,0}=\sum\min(\min(f_{son,0}-1,f_{son,1}),f_{son,2}) fi,0​=∑min(min(fson,0​−1,fson,1​),fson,2​)。

对于 f i , 1 f_{i,1} fi,1​ 同理。

而对于 f i , 2 f_{i,2} fi,2​ 则没有那么多顾及, f i , 2 = ∑ min ⁡ ( min ⁡ ( f s o n , 0 , f s o n , 1 ) , f s o n , 2 ) f_{i,2}=\sum\min(\min(f_{son,0},f_{son,1}),f_{son,2}) fi,2​=∑min(min(fson,0​,fson,1​),fson,2​)。

初值:对于叶子结点, f i , c i = 1 , f i , 1 − c i = f i , 2 = inf ⁡ f_{i,c_i}=1,f_{i,1-c_i}=f_{i,2}=\inf fi,ci​​=1,fi,1−ci​​=fi,2​=inf,对于非叶节点 f i , 0 / 1 = 1 f_{i,0/1}=1 fi,0/1​=1。

Code

#include<cstdio>
#include<algorithm>
#define N 100005
#define inf 123456789
using namespace std;
struct node
{int to,next,head;
}a[N<<1];
int n,m,rt,x,y,tot,c[N],f[N][3];
void add(int x,int y) {a[++tot].to=y;a[tot].next=a[x].head;a[x].head=tot;}
void dfs(int x,int fa)
{if (x>m) f[x][0]=f[x][1]=1;for (int i=a[x].head;i;i=a[i].next){int y=a[i].to;if (y==fa) continue;dfs(y,x);if (y<=m) {if (c[y]==1) f[x][0]++;}else f[x][0]+=min(min(f[y][0]-1,f[y][1]),f[y][2]);if (y<=m) {if (c[y]==0) f[x][1]++;}else f[x][1]+=min(min(f[y][1]-1,f[y][0]),f[y][2]);f[x][2]+=min(min(f[y][0],f[y][1]),f[y][2]);}
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=m;++i)scanf("%d",&c[i]),f[i][c[i]]=1,f[i][c[i]^1]=f[i][2]=inf;rt=m+1;for (int i=1;i<n;++i){scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(rt,0);printf("%d\n",min(min(f[rt][0],f[rt][1]),f[rt][2]));return 0;
}

【CQOI2009】叶子的染色相关推荐

  1. 【bzoj1304】[CQOI2009]叶子的染色 树形dp

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  2. [CQOI2009]叶子的染色(树形dp)

    链接:https://ac.nowcoder.com/acm/problem/19914 来源:牛客网 题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部 ...

  3. 【树形dp】P3155 [CQOI2009]叶子的染色

    你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 由于题目的这一点要求,我们可以得出,叶子节点的着色方案只与其上方第一个有色节点有关,所以选择哪个节点做r ...

  4. [CQOI2009]叶子的染色

    传送门:https://www.luogu.org/problemnew/show/P3155 一道挺水的树形dp题,然后我因为一个挺智障的问题debug了一晚上-- 嗯--首先想,如果一个点的颜色和 ...

  5. bzoj1304 [CQOI2009]叶子的染色 dfs+树形dp

    这个类型的题应该是做过很多次,但做起来还是比较慢 这个题常规方法是枚举根,但这样是n^2的,这样就考虑优化 可以作为根的点一定构成一棵树,所以每次找相邻的点一定可以考虑所有情况 然后就是如何用父节点的 ...

  6. 叶子的染色-基础树形dp

    题目描述 原题来自:CQOI 2009 给一棵有 m 个节点的无根树,你可以选择一个度数大于 11 的节点作为根,然后给一些节点(根.内部节点.叶子均可)着以黑色或白色.你的着色方案应保证根节点到各叶 ...

  7. 洛谷P3155:叶子的染色(树形dp)

    解析 本题的关键是选取哪一个根对答案没有影响 还有一个重要的性质是:根节点必定涂色 这点对每棵子树作为独立的子问题时依然成立 然鹅我完全没有看到上面那俩性质 直接暴力设计dp状态0..1.2 开始莽 ...

  8. 提高篇 第五部分 动态规划 第2章 树型动态规划

    例1 二叉苹果树 信息学奥赛一本通(C++版)在线评测系统 二叉苹果树_哔哩哔哩_bilibili 洛谷P2015 二叉苹果树 题目讲解 洛谷P2015 二叉苹果树 题目讲解_哔哩哔哩_bilibil ...

  9. 【QBXT】学习笔记——Day3/4图论+dp

    继续上传一波笔记吧. Day3 1.16AM 今天讲图论,以习题为主. 开篇水题: 给一幅图,若删去一个点后变成一棵树,则这个点合法.问哪些点合法. 思路根据树的性质:这个点不是割点,m-这个点的度数 ...

最新文章

  1. C++ 随机数生成的2种方法--生成指定范围内的随机数
  2. opencv-车牌区域提取
  3. 洛谷—— P1714 切蛋糕
  4. 机器学习入门需要多久
  5. numpy.argsort详解
  6. Matplotlib绘制动态曲线图,超简单!!
  7. Android开发中Edittext设置密码显示隐藏的多种方法
  8. 我的未来计算机作文,我的未来作文(精选4篇)
  9. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
  10. Autowired注解
  11. ubuntu 14.04 java_Ubuntu14.04下配置Java环境
  12. 设置maven的阿里云代理
  13. xcode7打包ipa文件
  14. Atitit.Gui控件and面板----db数据库区----- .数据库比较同步工具 vOa
  15. ASP.NET 访问项目网站以外的目录文件
  16. 当当(Elastic-job)分布式定时任务
  17. 修复ie浏览器无访问页面或dns问题
  18. FPGA之JESD204B接口——总体概要 尾片
  19. Thumbnails 压缩图片到指定kb
  20. 硬件基本概念-模拟电子电路

热门文章

  1. vue项目打包-图片
  2. 程序员年薪30万,偷车厘子解压被抓,网友:丢程序员的脸;蚂蚁集团专利数全球第一;华为开发者大会下月召开;Pulsar 2.7.1...
  3. 最新kali之pixiewps
  4. java自定义统计报表_用Java报表工具FineReport制作人员统计报表
  5. 《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)
  6. 计算机在游戏界面应用,电脑在游戏界面怎么回到桌面
  7. CAD2010 为了保护_漏保带的空开,如果长期关掉其中一个会影响对其它空开的保护作用吗?...
  8. Linux的基本学习(八)——正则、文本处理以及shell脚本
  9. CANoe11安装失败,有大佬知道怎么解决吗?
  10. 南开大学计算机学院 肖嘉文,南开大学计算机学院导师教师师资介绍简介-张志刚...