题目描述

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

输入

第一行包含两个正整数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 有边相连。

输出

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

样例输入

5 3
0
1
0
1 4
2 5
4 5
3 5

样例输出

2


题解

树形dp

考虑如果给定根节点的话怎么做:

设 $f[i][j]$ 表示以 $i$ 为根的子树,$i$ 到根节点的简单路径上最后一个有色节点的颜色是 $j$ 的最小着色点数。

那么对于所有 $i$ 的儿子 $k$ ,有 $f[i][j]+=min(f[k][j],f[k][j\text{^}1])$ 。边界条件 $f[u][c[u]]=0,f[u][c[u]\text{^}1]=\infty$ ,其中 $u$ 是叶子节点。

那么 $min(f[root][0],f[root][1])+1$ 就是 $root$ 作为树根时的答案,其中 $+1$ 指的是根节点需要再着色一次。

一次dp的时间复杂度是 $O(n)$ ,我们可以枚举每个节点为根,复杂度为 $O(n^2)$ ,可过。

但是还有更优的做法:考虑根节点从 $x$ 变化到相邻的点 $y$ 的过程,那么 $x$ 为根时,$y$ 的着色只有两种情况:染了与 $x$ 不同的颜色、没有染色。

第一种情况显然换根后方案可以不变,第二种情况显然可以换根时把 $x$ 的着色该为染 $y$ ,答案不变。因此有 $ans_y\le ans_x$,同时从 $y$ 换到 $x$ 时有 $ans_x\le ans_y$ ,所以 $ans_x=ans_y$。

于是选择任意一个非叶节点作为根做一次dp即可,时间复杂度 $O(n)$

#include <cstdio>
#include <algorithm>
#define N 10010
using namespace std;
int head[N] , to[N << 1] , next[N << 1] , cnt , f[N][2];
inline void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x , int fa)
{
int i;
for(i = head[x] ; i ; i = next[i])
if(to[i] != fa)
dfs(to[i] , x) , f[x][0] += min(f[to[i]][0] , f[to[i]][1] + 1) , f[x][1] += min(f[to[i]][1] , f[to[i]][0] + 1);
}
int main()
{
int n , m , i , x , y;
scanf("%d%d" , &m , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &x) , f[i][x] = 0 , f[i][x ^ 1] = m;
for(i = 1 ; i < m ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
dfs(m , 0);
printf("%d\n" , min(f[m][0] , f[m][1]) + 1);
return 0;
}

【bzoj1304】[CQOI2009]叶子的染色 树形dp的更多相关文章

  1. BZOJ1304: [CQOI2009]叶子的染色 树形dp

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

  2. BZOJ 1304: [CQOI2009]叶子的染色 树形DP + 结论

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  3. BZOJ1304 CQOI2009 叶子的染色 【树形DP】

    BZOJ1304 CQOI2009 叶子的染色 Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方 ...

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

    又是一道优美的dp Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的 ...

  5. BZOJ1304: [CQOI2009]叶子的染色

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1304 树形dp. 可以发现其实根选在哪里都是没有问题的. f[u][0],f[u][1],f[ ...

  6. BZOJ1304 CQOI2009叶子的染色(树形dp)

    令f[i]表示i子树内最少染色次数,加上012状态分别表示该子树内叶节点已均被满足.存在黑色叶节点未被满足.存在白色叶节点未被满足,考虑i节点涂色情况即可转移.事实上贪心也可以. #include&l ...

  7. BZOJ_1304_[CQOI2009]叶子的染色_树形DP

    BZOJ_1304_[CQOI2009]叶子的染色_树形DP Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白 ...

  8. 【BZOJ1304】[CQOI2009]叶子的染色(动态规划)

    [BZOJ1304][CQOI2009]叶子的染色(动态规划) 题面 BZOJ 洛谷 题解 很简单. 设\(f[i][0/1/2]\)表示以\(i\)为根的子树中,还有颜色为\(0/1/2\)(\(2 ...

  9. BZOJ 1304: [CQOI2009]叶子的染色

    1304: [CQOI2009]叶子的染色 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 566  Solved: 358[Submit][Statu ...

随机推荐

  1. elk6.3.2在线安装中文分词工具IK

    1.进入ES目录并执行安装(注意版本号改成你需要的版本) cd /usr/share/elasticsearch ./bin/elasticsearch-plugin install https:// ...

  2. Typeahead的使用总结

    Typeahead是Bootstrap的自动补全JS插件. 最近项目中用到,总结一下. 与autocomplish类似,通过ajax实现,实现流程是前台输入关键字,后台根据关键字查询出信息,构造jso ...

  3. SQL计算出百分比

    有clients和lead_sources俩表.mysql数据库. lead_sources表结构类似: clients表中的lead_source_id是外键.现在要统计某时间段内client内每种 ...

  4. 使数据可供ArcGIS Server访问

    内容来自ESRI官方文档(点击访问),简单总结如下: 1 ArcGIS Server用于发布服务的数据必须存储在服务器可以访问的位置: 2 这样的位置有三种类型: 本地路径:将数据本地存储在每台 Ar ...

  5. convert-Csharp-DateTime-Ticks-to-js

    <!DOCTYPE html> <html> <head> <script> function myFunction() { var b = forma ...

  6. editText设置最大长度

    xml中可以设置为: <EditText android:layout_width = "fill_parent" android:layout_height = " ...

  7. Appium(Python)API

    1.创建新的会话desired_caps = desired_caps = {  'platformName': 'Android',  'platformVersion': '7.0',  'dev ...

  8. ISE 14.7安装教程最新版(Win10安装)——解决Win10安装完后打不开快捷方式的方法

    ISE 14.7安装教程最新版(Win10安装) Xilinx ISE是一款世界著名的硬件设计软件,它为设计流程的每一步都提供了直观的生产力增强工具,覆盖从系统级设计探索.软件开发和基于HDL硬件设计 ...

  9. 搭建redis集群的过程中遇到的问题

    1.GCC没有安装或版本不对 报错信息如下 CC adlist.o /bin/sh: cc: command not found make[1]: *** [adlist.o] Error 127 m ...

  10. HDU 1394Minimum Inversion Number

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...