P3155 [CQOI2009]叶子的染色

题目描述

给一棵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 有边相连。

输出格式:

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


显然是树形DP。

\(dp[i][j]\)表示以\(i\)为子树外面(注意是“外面”,不是这个点)需染\(0,1,2\)(即不需要)的最小染色点数

转移:

\(dp[i][0]=\sum min(dp[son][0],dp[son][2]);\)

\(dp[i][1]=\sum min(dp[son][1],dp[son][2]);\)

\(dp[i][2]=\sum dp[son][2];\)

当然有更简单的转移方法。

然后开始推换根。

成功没推出来

事实上这个题都给了提示,“可以选择一个”,根只要不是度为1的节点都是可以的。

证明:两个相邻的点不可能换根后更优,分6种情况讨论即可。


code:

#include <cstdio>
#include <cstring>
int max(int x,int y) {return x>y?x:y;}
int min(int x,int y) {return x<y?x:y;}
const int N=10010;
int m,n;
int dp[N][3];//以i为子树外面需染0,1,2(即不需要)的最小染色点数
struct Edge
{
int to,next;
}edge[N*2];
int head[N],cnt=0,used[N];
void add(int u,int v)
{
edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
} void dfs(int now)
{
used[now]=1;
int sum0=0,sum1=0,sum2=0;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(!used[v])
{
dfs(v);
sum0+=min(dp[v][0],dp[v][2]);
sum1+=min(dp[v][1],dp[v][2]);
sum2+=dp[v][2];
}
}
if(now>n)
{
dp[now][0]=sum0;
dp[now][1]=sum1;
dp[now][2]=min(min(sum0,sum1)+1,sum2);
}
}
int ans=0x3f3f3f3f;
int color[N];
int main()
{
scanf("%d%d",&m,&n);
int u,v;
for(int i=1;i<=n;i++)
scanf("%d",color+i);
for(int i=1;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i][color[i]]=0;
dp[i][2]=1;
}
dfs(n+1);
printf("%d\n",dp[n+1][2]);
return 0;
}

2018.6.2

洛谷 P3155 [CQOI2009]叶子的染色 解题报告的更多相关文章

  1. P3155 [CQOI2009]叶子的染色

    P3155 [CQOI2009]叶子的染色 题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到 ...

  2. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  3. [CQOI2009] 叶子的颜色 解题报告(树形DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1304 Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为 ...

  4. 洛谷 P2774 方格取数问题 解题报告

    P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  5. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  6. 洛谷 P2168 [NOI2015]荷马史诗 解题报告

    P2168 [NOI2015]荷马史诗 题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷 ...

  7. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  8. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  9. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

随机推荐

  1. pycharm2019注册码一键实时获取,永久有效!

    pycharm2019专业版激活码 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2 ...

  2. 《DISTRIBUTED SYSTEMS Concepts and Design》读书笔记 一

    第二章 系统模型 描述分布式系统的三种模型 Physical models : 用机器,网络,硬件等语言去描述整个系统. Architectural models : 用计算.计算任务.计算单元等语言 ...

  3. 为小米(红米)6A解锁_ROOT_安装天下游虚拟定位教程_已亲身验证通过!附图

    第一步骤: 把TeamViewer发给客户 第二步骤: 在自己电脑上购买小米账号:http://shop1.91kami.com/UXWHTEY9KN?cid=1200 要求:(购买邮箱注册账号,需要 ...

  4. Linux课题实践三——程序破解

    2.3   程序破解 20135318 刘浩晨 1.     掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即“空指令”.执行到NOP指令时,CPU什么也不做,仅仅当做一 ...

  5. 201303014001 张敏 计科高职13-1 github使用心得

    Github:https://github.com/zhangmin131/text 个人心得体会: Git是一种良好的.支持分支管理的代码管理方式,能很好地解决团队之间协作的问题.每个工程师在自己本 ...

  6. HDU 2052 Picture

    http://acm.hdu.edu.cn/showproblem.php?pid=2052 Problem Description Give you the width and height of ...

  7. Java与JavaScript之间关于JSON的是非恩怨

    http://blog.csdn.net/joyhen/article/details/43271569 js 单引号替换成双引号,双引号替换成单引号 操作 解决问题的场景: Java端生成了JSON ...

  8. What is the best Java email address validation method?

    https://stackoverflow.com/questions/624581/what-is-the-best-java-email-address-validation-method htt ...

  9. intval()和int()

    int intval ( mixed $var [, int $base ] )    通过使用特定的进制转换(默认是十进制),参数base表示进制,只有当var是字符串时,base才会有意义,表示按 ...

  10. React Native & Web APP

    React Native Build native mobile apps using JavaScript and React https://facebook.github.io/react-na ...