zoukankan      html  css  js  c++  java
  • 【BZOJ1304】[CQOI2009]叶子的染色 树形DP

    【BZOJ1304】[CQOI2009]叶子的染色

    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

    Sample Output

    2

    HINT

    M<=10000

    N<=5021

    题解:结论:选择任意一个点为根,答案都是相同的。

    假如原来以x为根,y与x相邻,那么x与y的颜色不可能相同。既然颜色不同,那么将根从x变成y对答案显然也不会产生影响。

    所以随便选一个点为根,然后树形DP。用f[x][0/1]表示x的子树中,最后一个点想要得到一个白色/黑色的祖先,的最小代价,转移十分容易~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int maxn=10010;
    int n,m,cnt;
    int to[maxn<<1],next[maxn<<1],head[maxn],f[maxn][2],fa[maxn],c[maxn];
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    inline void add(int a,int b)
    {
    	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
    }
    void dfs(int x)
    {
    	if(x<=n)
    	{
    		f[x][c[x]]=0,f[x][c[x]^1]=1<<20;
    		return ;
    	}
    	for(int i=head[x];i!=-1;i=next[i])	if(to[i]!=fa[x])
    	{
    		fa[to[i]]=x,dfs(to[i]);
    		f[x][0]+=min(f[to[i]][0],f[to[i]][1]+1);
    		f[x][1]+=min(f[to[i]][1],f[to[i]][0]+1);
    	}
    }
    int main()
    {
    	m=rd(),n=rd();
    	int i,a,b;
    	memset(head,-1,sizeof(head));
    	for(i=1;i<=n;i++)	c[i]=rd();
    	for(i=1;i<m;i++)	a=rd(),b=rd(),add(a,b),add(b,a);
    	dfs(m);
    	printf("%d",min(f[m][0],f[m][1])+1);
    	return 0;
    }
  • 相关阅读:
    QTP 处理webtable中的数据
    Error 1406.Setup cannot write the value Microsoft
    QTP打开WinTree中的指定节点
    Excel数据操作
    VBS中实现函数多返回值
    QTP的回放模式
    VBS中运行应用程序的两种方式及WshShell对像浅析
    程序员奇葩面试的奇葩问题
    Android如何实现毛玻璃效果之Android高级模糊技术
    Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7671142.html
Copyright © 2011-2022 走看看