题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1304

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

Simple Output

2

HINT

M<=10000

N<=5021

这是一道树形DP

首先我们明确,对于任意一个最优方案,我们都可以把它改变成根节点是染色的情况。什么意思呢?就是我可以把其中某个染色的点改成透明的,然后根节点染色,产生一样的效果。请读者自行画几张图,大概就会明白。

于是我们就得出选任何一个非叶子结点做根其实都是一样的

并且我们设计的DP只需要两个状态就可以了,dp[x][0/1]代表以x为根节点的子树染成0/1的最少染色节点数,状态转移方程如下:

dp[x][1]+=min(dp[e[i].to][1]-1,dp[e[i].to][0])
dp[x][0]+=min(dp[e[i].to][1],dp[e[i].to][0]-1)

若是当前点x染成黑色,那么他的儿子中黑色的点就可以变成透明的,对结果没有影响。白色同理。

如果x是叶子结点,若它的c值代表黑色,则dp[x][1]的最小染色数我们设为inf,这是为了排除这个决策

下面附上代码:

#include<bits/stdc++.h>
using namespace std; const int maxn=+;
const int inf=1e9+;
int m,n,k=;
int head[maxn],c[maxn],dp[maxn][];
struct EDGE
{
int to,next;
}e[maxn];
void add(int u,int v)
{
e[++k].next=head[u];e[k].to=v;head[u]=k;
}
void dfs(int x,int fa)
{
if(x<=n)
{
dp[x][c[x]]=;
dp[x][c[x]^]=inf;
return;
}
dp[x][]=dp[x][]=;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to==fa) continue;
dfs(e[i].to,x);
dp[x][]+=min(dp[e[i].to][]-,dp[e[i].to][]);
dp[x][]+=min(dp[e[i].to][],dp[e[i].to][]-);
}
}
int main()
{
int ans;
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d",&c[i]);
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs(n+,);
ans=min(dp[n+][],dp[n+][]);
printf("%d\n",ans);
}

[CQOI2009] 叶子的颜色 解题报告(树形DP)的更多相关文章

  1. 洛谷 P3155 [CQOI2009]叶子的染色 解题报告

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

  2. [CQOI2009]叶子的染色【性质+树形Dp】

    Online Judge:Bzoj1304,Luogu P3155 Label:无根树,树形Dp 题目描述 给定一棵\(N\)个节点的无根树,它一共有\(K\)个叶子节点.你可以选择一个度数大于1的节 ...

  3. [codeforces contest 1119 F] Niyaz and Small Degrees 解题报告 (树形DP+堆)

    interlinkage: http://codeforces.com/contest/1119/problem/F description: 有一颗$n$个节点的树,每条边有一个边权 对于一个$x$ ...

  4. [JZOJ4272] [NOIP2015模拟10.28B组] 序章-弗兰德的秘密 解题报告(树形DP)

    Description 背景介绍弗兰德,我不知道这个地方对我意味着什么.这里是一切开始的地方.3年前,还是个什么都没见过的少年,来到弗兰德的树下,走进了封闭的密室,扭动的封尘已久机关,在石板上知道了这 ...

  5. [NOI.AC 2018NOIP模拟赛 第三场 ] 染色 解题报告 (DP)

    题目链接:http://noi.ac/contest/12/problem/37 题目: 小W收到了一张纸带,纸带上有 n个位置.现在他想把这个纸带染色,他一共有 m 种颜色,每个位置都可以染任意颜色 ...

  6. JXOI2017颜色 解题报告

    JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...

  7. [BZOJ1026][SCOI2009]windy数 解题报告|数位dp

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直 ...

  8. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  9. [NOI2002] Robot 解题报告(数论+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1408 Description 3030年,Macsy正在火星部署一批机器人. 第1秒,他 ...

随机推荐

  1. OS - 线程和进程的差别

    进程是资源分配的基本单位,又是调度执行的基本单位.比如.用户执行自己的程序,系统就创建一个进程.并为它分配资源,包含各种表.内存空间.磁盘空间.I/O设备等. 然后.把该进程放入进程的就绪队列.进程调 ...

  2. STM32F407VG (四)时钟配置

    1.STM32 F407VG 的starup_stm32f40_41xxx.s的例如以下位置调用 IMPORT SystemInit,之后调用main函数,所以 进入main函数时候就已经自己主动完毕 ...

  3. poj_3071概率dp

    确定好对手就简单了. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  4. Mysql实战45讲 06讲全局锁和表锁:给表加个字段怎么有这么多阻碍 极客时间 读书笔记

    Mysql实战45讲 极客时间 读书笔记 Mysql实战45讲 极客时间 读书笔记 笔记体会: 根据加锁范围:MySQL里面的锁可以分为:全局锁.表级锁.行级锁 一.全局锁:对整个数据库实例加锁.My ...

  5. excel文件使用html导出

    <table><tr><td>1</td></tr><tr><td>2</td></tr>& ...

  6. atom安装插件失败 latex

    用atom写latex 链接 http://www.cnblogs.com/schaepher/p/5934184.html 但在gui下安装插件失败 按照以下步骤解决了 安装gitbash cd . ...

  7. Ini配置文件操作

    package cn.com.szhtkj.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...

  8. 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路

    #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...

  9. NodeJS学习笔记 (7)网络服务-http-client(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: ClientRequest概览 当你调用 http.request(options ...

  10. C语言手册-read

    名称: pread,read-从文件读 语法: #include <unistd.h> ssize_t pread(int fildes, void *buf, size_t nbyte, ...