BZOJ 1304: [CQOI2009]叶子的染色
1304: [CQOI2009]叶子的染色
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 566 Solved: 358
[Submit][Status][Discuss]
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
0
1
0
1 4
2 5
4 5
3 5
Sample Output
HINT
M<=10000
N<=5021
Source
分析:
好久每写过这么短的代码了233...
我们假定已经选定了根节点,那么就变成了一道很水的树形DP,f[i][0/1]代表以i为根节点的子树i染成0/1的最少染色节点数,转移就不说了,自己看吧...
现在我们不知道根节点是什么?换根么?再仔细思考一下...其实可以证明无论选择谁做根结点都是一样的...
看12这两个节点,首先这两个节点颜色不可能相同,如果相同那么把一个变成透明的一定更优,所以无论12哪个为根节点ans不变...
如果颜色不同呢,那么貌似更没有影响了...
所以我们随便选择一个非叶子节点作为根DP一遍就好了...
代码:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 //by NeighThorn 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 9 const int maxn=10000+5; 10 11 int n,m,c[maxn],hd[maxn],to[maxn*2],nxt[maxn*2],cnt,f[maxn][2]; 12 13 inline void add(int x,int y){ 14 to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++; 15 } 16 17 inline void dfs(int root,int fa){ 18 f[root][0]=f[root][1]=1; 19 if(root<=m){ 20 if(c[root]==0) 21 f[root][1]=inf; 22 else 23 f[root][0]=inf; 24 } 25 for(int i=hd[root];i!=-1;i=nxt[i]) 26 if(to[i]!=fa){ 27 dfs(to[i],root); 28 f[root][0]+=min(f[to[i]][0]-1,f[to[i]][1]); 29 f[root][1]+=min(f[to[i]][1]-1,f[to[i]][0]); 30 } 31 } 32 33 signed main(void){ 34 memset(hd,-1,sizeof(hd)); 35 scanf("%d%d",&n,&m);cnt=0; 36 for(int i=1;i<=m;i++) 37 scanf("%d",&c[i]); 38 for(int i=1,x,y;i<n;i++) 39 scanf("%d%d",&x,&y),add(x,y),add(y,x); 40 dfs(m+1,-1); 41 printf("%d\n",min(f[m+1][0],f[m+1][1])); 42 return 0; 43 }
View Code
by NeighThorn
转载于:https://www.cnblogs.com/neighthorn/p/6188302.html
BZOJ 1304: [CQOI2009]叶子的染色相关推荐
- 【bzoj1304】[CQOI2009]叶子的染色 树形dp
题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...
- [CQOI2009]叶子的染色(树形dp)
链接:https://ac.nowcoder.com/acm/problem/19914 来源:牛客网 题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部 ...
- 【树形dp】P3155 [CQOI2009]叶子的染色
你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 由于题目的这一点要求,我们可以得出,叶子节点的着色方案只与其上方第一个有色节点有关,所以选择哪个节点做r ...
- [CQOI2009]叶子的染色
传送门:https://www.luogu.org/problemnew/show/P3155 一道挺水的树形dp题,然后我因为一个挺智障的问题debug了一晚上-- 嗯--首先想,如果一个点的颜色和 ...
- bzoj1304 [CQOI2009]叶子的染色 dfs+树形dp
这个类型的题应该是做过很多次,但做起来还是比较慢 这个题常规方法是枚举根,但这样是n^2的,这样就考虑优化 可以作为根的点一定构成一棵树,所以每次找相邻的点一定可以考虑所有情况 然后就是如何用父节点的 ...
- 【CQOI2009】叶子的染色
Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含 ...
- BZOJ 1303: [CQOI2009]中位数图【前缀和】
1303: [CQOI2009]中位数图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2737 Solved: 1698 [Submit][Sta ...
- bzoj 1303: [CQOI2009]中位数图
1303: [CQOI2009]中位数图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2747 Solved: 1704 [Submit][Sta ...
- 叶子的染色-基础树形dp
题目描述 原题来自:CQOI 2009 给一棵有 m 个节点的无根树,你可以选择一个度数大于 11 的节点作为根,然后给一些节点(根.内部节点.叶子均可)着以黑色或白色.你的着色方案应保证根节点到各叶 ...
- 洛谷P3155:叶子的染色(树形dp)
解析 本题的关键是选取哪一个根对答案没有影响 还有一个重要的性质是:根节点必定涂色 这点对每棵子树作为独立的子问题时依然成立 然鹅我完全没有看到上面那俩性质 直接暴力设计dp状态0..1.2 开始莽 ...
最新文章
- php 网站速度慢,php – 个人用户网站速度慢,但他们可以切换浏览器?
- python 科学计算设计_用Python做科学计算 高清晰PDF
- python求1+2+3+....+100的和注意事项_python006(求1-2+3-4+5.....99的所有数的和)
- matlab绘制路线图_绘制国际水域路线图
- 南大cssci期刊目录_最新版CSSCI来源期刊目录(2019-2020)及增减变化!【南大核心】...
- 【Flutter】Dart中的匿名函数、闭包
- php atlas,Apache Atlas是什么意思
- JAVA里plain_Java中POJO及其细分XO、DAO的概念
- 简约前端工程师简历PPT模板
- ppt编辑数据链接文件不可用_拷过来的ppt不能编辑 - 卡饭网
- python生成Androd deviceid
- java图片合成_Java图片处理(一)图片合成
- SQL CAST与CONVERT区别
- centOS 8 报错:Failed to set locale, defaulting to C.UTF-8
- Vue全家桶学习笔记:Vue Router篇
- request.getParameter() request.getAttribute()区别
- 在中国要想发财的22条秘诀!
- 【转载】冰美人淘宝装修教程--索引
- 前锋linux试题,大学篮球考试题库.doc
- 为什么springcloud值得我们学习?