叶子的染色

题目描述

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

  • 做了半天发现想多了
  • 一个神奇的结论:无论把哪个非叶子节点当根,答案都是一样的

    证明:现在根是\(x\),有个儿子节点为\(y\),\(xy\)颜色相同的话肯定只有一个有贡献,颜色不同那更没什么影响了。
  • 直接树形dp就行了,\(dp[i][0/1]\)表示\(i\)号点及子树中最近一个点要什么颜色的最小染色方案
  • \(dp[u][j]=min(dp[v][j]-1,dp[v][1-j] )+1\)
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=1e4+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>inline T read()
{
T f=1,ans=0;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>inline void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("3155.in","r",stdin);
freopen("3155.out","w",stdout);
#endif
}
struct edge
{
int v,nex;
}e[N<<1];
int head[N],tt;
void add(int x,int y)
{
e[++tt]=(edge){y,head[x]};head[x]=tt;
}
int m,n,cl[N],in[N];
void input()
{
int x,y;
m=read<int>();n=read<int>();
For(i,1,n)cl[i]=read<int>();
For(i,1,m-1)
{
x=read<int>();y=read<int>();
add(x,y),add(y,x);
++in[x],++in[y];
}
}
#define rg register
int dp[N][3];
const int inf=0x3f3f3f3f;
void dfs(int u,int pre)
{
if(in[u]==1)
{
dp[u][cl[u]]=1;dp[u][cl[u]^1]=inf;
return;
}
int v;
dp[u][0]=dp[u][1]=1;
for(rg int i=head[u];i;i=e[i].nex)
{
v=e[i].v;
if(v==pre)continue;
dfs(v,u);
For(j,0,1)dp[u][j]+=min(dp[v][j]-1,dp[v][j^1]);
}
}
void work()
{
dfs(n+1,0);
write(min(dp[n+1][0],dp[n+1][1]),'\n');
}
int main()
{
file();
input();
work();
return 0;
}

CQOI2009叶子的染色的更多相关文章

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

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

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

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

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

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

  4. P3155 [CQOI2009]叶子的染色

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

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

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

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

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

  7. bzoj千题计划233:bzoj 1304: [CQOI2009]叶子的染色

    http://www.lydsy.com/JudgeOnline/problem.php?id=1304 结论1:根节点一定染色 如果根节点没有染色,选择其子节点的一个颜色,那么所有这个颜色的子节点都 ...

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

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

  9. luogu3155 [CQOI2009]叶子的染色

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

随机推荐

  1. python 对时间操作

    from datetime import datetime,timedelta 'date_test':fields.function(_datetime_all,type='datetime',  ...

  2. Luogu4609 FJOI2016 建筑师 第一类斯特林数

    题目传送门 题意:给出$N$个高度从$1$到$N$的建筑,问有多少种从左往右摆放这些建筑的方法,使得从左往右看能看到$A$个建筑,从右往左看能看到$B$个建筑.$N \leq 5 \times 10^ ...

  3. angularjs的ng-change事件演示

    今天练习angularjs的ng-change事件. 比如用户作出选择时,系统所指定的选项中,没有用户合适的选项.此时我们可以让用户填写. 刚开始文本框是隐藏的.当用户选择了checkbox之后才会显 ...

  4. mybatis 反射bean规则

    1,根据查询字段名,寻找 bean变量名设置,变量可为私有属性 2,根据查询字段名 set方法名,设置bean属性 此方法 为 ‘set‘+字段名,大小写忽略,即 方法set后面第一个字母可以是大小写 ...

  5. Can't connect to MySQL server (10060)

    前天刚装的MySql,今天再次使用就出现了标题显示的错误.我是本地机器连接Linux下的MySql. 网上有一些解决方案: 方法一.检查本地的防火墙 如果是如上状态,请关闭防火墙再试. 方法二.检查服 ...

  6. [转]Linux下安装Java环境配置步骤详述

    1.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择 ...

  7. UML类图应该怎么看?

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 我每次写博基本都是这样开头,除了激励自己,每句话也都挺有道理! 呵呵,今天是阴历2017年我工 ...

  8. [Oracle][Corruption]发生ORA00600[kdsgrp1]的时候,如何进行调查

    本质上,这很可能是坏块引发的,所以需要调查 关联的Table 中的坏块状况: Excerpt of trace file============================*** 2017-08- ...

  9. 线程池ThreadPoolExecutor整理

    项目用到线程池,但是其实很多人对原理并不熟悉 ,这里只是整理一下 ThreadPoolExecutor java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心 ...

  10. CSS 分类 (Classification) 实例

    CSS 分类 (Classification) 实例CSS 分类属性 (Classification)CSS 分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素 ...