Description
  给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根、内部结点和叶子均可)着以黑色或白色。你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身)。
  对于每个叶结点u,定义c[u]为从u到根结点的简单路径上第一个有色结点的颜色。给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少。

Input
  第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数。结点编号为1,2,…,m,其中编号1,2,… ,n是叶子。以下n行每行一个0或1的整数(0表示黑色,1表示白色),依次为c[1],c[2],…,c[n]。以下m-1行每行两个整数a,b(1<=a < b <= m),表示结点a和b 有边相连。

Output
  仅一个数,即着色结点数的最小值。

Sample Input
5 3
0
1
0
1 4
2 5
4 5
3 5

Sample Output
2

Data Constraint

Hint
【数据范围】  
  1<=N,M<=100000
.
.
.
.
.
.

分析

选择任意一个点为根,答案都是相同的。
假如原来以x为根,y与x相邻,那么x与y的颜色不可能相同。既然颜色不同,那么将根从x变成y对答案显然也不会产生影响。
所以随便选一个点为根,然后树形DP。用f[x][0/1]表示x的子树中,最后一个点想要得到一个白色/黑色的祖先的最小代价。
.
.
.
.
.

程序:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int to[100000],cnt,from[100000],head[100000],f[100000][2],n,m,inf=2147483647,c[100000];
void insert(int x,int y)
{
    to[++cnt]=y; from[cnt]=head[x]; head[x]=cnt;
}
void dp(int root,int fa)
{
    f[root][0]=f[root][1]=1;
    if (root<=m) if (c[root]) f[root][0]=inf; else f[root][1]=inf;
    for (int i=head[root];i;i=from[i])
    {        if (to[i]!=fa)
        {            dp(to[i], root);
            f[root][0]+=min(f[to[i]][0]-1,f[to[i]][1]);
            f[root][1]+=min(f[to[i]][1]-1,f[to[i]][0]);
        }    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    scanf("%d",&c[i]);
    for (int i=1;i<=n-1;i++)
    {        int x,y;
        scanf("%d%d",&x,&y);
        insert(x,y); insert(y,x);
    }
    dp(m+1,-1);
    printf("%d",min(f[m+1][1],f[m+1][0]));
    return 0;
}

转载于:https://www.cnblogs.com/YYC-0304/p/9499938.html

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

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

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

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

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

  3. #树形dp#jzoj 1010 洛谷 3155 叶子的颜色

    题目 对于每个叶结点u,定义c[u]为从u到根结点的简单路径上第一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. 分析 这道题可以用树形dp,f[x][0/1]f[x ...

  4. [CQOI2009]叶子的染色

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

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

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

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

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

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

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

  8. JZOJ 5050. 【GDOI2017模拟一试4.11】颜色树

    Description 思源湖畔有一棵树,那是独孤玉溪最喜欢的地方. 传说中,这棵不见边际的树有N个节点,每个节点都有1片叶子,每片叶子都拥有K种颜色中的一种,独孤玉溪喜欢爬到这棵树上,沿着一条路线摘 ...

  9. applicationproperties不是小叶子_三角梅整株叶子发黄从这里找原因,早解决早生长!...

    家里的花草长得好不好,看叶子就行,长势好的叶子翠绿,油亮有光泽,长势不好的叶子发黄,暗淡无生机.所以如果花草的叶子不健康,那么就是哪里出了问题,需要及时找出原因解决.为什么家里盆栽的三角梅开花性能不错 ...

最新文章

  1. python朋友圈为什么这么火-利用Python让你的微信朋友圈与众不同,更加高大上
  2. 记一次WiFi芯片W600上的一个浮点运算
  3. php无限分类原理,php 递归无限级分类原理和实现代码
  4. ActivityInfo taskAffinity
  5. 新入驻博客园立一个flag
  6. 数据结构四——散列表(下)
  7. 推进五通一平:手淘技术三大容器 五大方案首次整体亮相 百川开放升级
  8. 硬件检测你用哪一款工具呢?
  9. libusb-win32
  10. 数学建模算法与应用习题 1-4 解析 MATLAB 换一下思路做题
  11. 【php基础入门】细说PHP中的函数声明与使用详解(重要)
  12. js实现select动态添加option,默认为选中状态
  13. javaweb从入门到精通教程,7天彻底搞定javaweb
  14. 小程序游戏开发一般多少钱?游戏小程序开发制作
  15. 微信小程序入门,可跳过
  16. MLIR再深入 —— CodeGen 总结
  17. 使用百度地图API实现地图生成、标记以及标注
  18. 如何在安装 Enscape渲染器时禁用或启用弹出窗口
  19. python正六边形的面积公式_六边形网格坐标的快速计算方法
  20. 一名理想主义的程序员

热门文章

  1. 云炬随笔20171205
  2. C语言const使用
  3. ASP.NET 页面事件执行顺序 收藏
  4. linux-IO之copy的实现
  5. FreeRTOS笔记2
  6. docker 镜像上传至hub时报错,提示:denied: requested access to the resource is denied
  7. SQL 常用数据类型汇总
  8. 有时候明明没有问题的程序为什么通不过?
  9. 收藏一个有趣的帖子,现在的客户端真有点让人不安,难怪XSS。。。
  10. ioctl中的ifconf ifreg 结构