链接:https://ac.nowcoder.com/acm/problem/19914
来源:牛客网

题目描述
给一棵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 有边相连。
输出描述:
仅一个数,即着色结点数的最小值。
示例1
输入
复制
5 3
0
1
0
1 4
2 5
4 5
3 5
输出
复制
2
给定的c数组中的值都是叶子节点。一开始没看清楚,怎么也想不出来。我们用dp[i][0/1]来代表第i个结点染成白色或者黑色之后,以它为根的子树最小的染色次数。
对于叶子节点,如果他是白色,就将dp[i][0]设置为1,否则就将dp[i][1]设置为无穷大。反之也一样。
对于当前节点,如果它染成白色,那么它的子树中某个染成白色点就可以不用染色了,这样的话结果是更优的。这样的话,就不断的寻找最优值。
状态转移方程:
dp[u][1]+=min(dp[to][1]-1,dp[to][0]);
dp[u][0]+=min(dp[to][0]-1,dp[to][1]);
代码如下:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;const int maxx=1e5+100;
struct edge{int to,next;
}e[maxx<<1];
int head[maxx],tot;
int dp[maxx][2],c[maxx];
int n,m;
/*------------事前准备-----------*/
inline void init()
{memset(head,-1,sizeof(head));tot=0;
}
inline void add(int u,int v)
{e[tot].to=v,e[tot].next=head[u],head[u]=tot++;
}
/*-------------树形dp------------*/
inline void dfs(int u,int f)
{dp[u][0]=dp[u][1]=1;if(u<=n){if(c[u]) dp[u][0]=inf;else dp[u][1]=inf;}for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==f) continue;dfs(to,u);dp[u][1]+=min(dp[to][1]-1,dp[to][0]);//两种取最优。dp[u][0]+=min(dp[to][0]-1,dp[to][1]);}
}int main()
{int x,y;while(~scanf("%d%d",&m,&n)){init();for(int i=1;i<=n;i++) scanf("%d",&c[i]);for(int i=1;i<m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(n+1,0);//前n个结点都是叶子节点,所以从n+1dfsprintf("%d\n",min(dp[n+1][0],dp[n+1][1]));}return 0;
}

努力加油a啊,(o)/~

[CQOI2009]叶子的染色(树形dp)相关推荐

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

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

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

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

  3. [CQOI2009]叶子的染色

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

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

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

  5. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2437  Solved: 1034 [Submit][St ...

  6. bzoj4033: [HAOI2015]树上染色(树形dp)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3269  Solved: 1413 [Submit][St ...

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

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

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

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

  9. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

最新文章

  1. 机器学习基础:朴素贝叶斯及经典实例讲解
  2. magic_quotes_gpc和magic_quotes_runtime的区别和用法详解
  3. language is the key
  4. 微软的SQLHelper类(含完整中文注释)
  5. android listview 刷新不正确,Android中设置ListView内容刷新问题
  6. kafka日志格式和分区
  7. vb代码转换为java_有人可以解释如何使用JACOB将VB代码转换为Java吗?
  8. avalon 笔记---Mr.wing
  9. sudo rpm安装时$USER是root
  10. Win11字体显示不全怎么解决?
  11. 20年前的人机大战,IBM“深蓝”耍了花招
  12. 黑猴子的家:Azkaban3.84.4之参考资料
  13. 遗传算法中常见遗传算子
  14. Java设计模式学习以及底层源码分析
  15. GD32VF103_定时器中断
  16. 后端如何编写API文档给到前端?
  17. 你说的H5到底是什么,跟Html有什么关系,能吃吗
  18. Hbuilderx uniapp本地打包android 项目
  19. 560套Axure低保真原型打包下载!各行各业产品经理、交互设计师必备资源库!!!
  20. 虚拟主机如何清空网站程序文件和mysql数据库数据

热门文章

  1. pwmc语言调速程序_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...
  2. java 调用htm中js函数_Lua中调用C函数(lua5.2.3)
  3. 保留3位 python_Python基础(六)
  4. pb怎么打开服务器上的文件夹,前台PB客户端怎么连接服务器上的SQL后台数据库...
  5. 没有语言基础可以学python_没有Python语言基础可以学习深度学习吗?
  6. opengl编程指南第8版源码编译详细说明
  7. html5 sidetoggle,javascript-使用React.js实现SlideToggle功能
  8. Spark2.4.0 SparkEnv 源码分析
  9. 20179311《网络攻防实践》第一周作业
  10. POJ 2653 Pick-up sticks 判断线段相交