博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3155 [CQOI2009]叶子的染色 解题报告
阅读量:5133 次
发布时间:2019-06-13

本文共 1161 字,大约阅读时间需要 3 分钟。

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 
#include
int max(int x,int y) {return x>y?x:y;}int min(int x,int y) {return x
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

2018.6.2

转载于:https://www.cnblogs.com/butterflydew/p/9126993.html

你可能感兴趣的文章
Hdu5000
查看>>
上传各种尺寸的头像,处理成正圆形的方法:【孟祥阳】
查看>>
dreamweaver 8的替换功能
查看>>
《编写可读代码的艺术》---变量和可读性
查看>>
关于 width;height
查看>>
交换排序
查看>>
查看现有运行的linux服务器有多少内存条
查看>>
有趣的数字图形I
查看>>
Linux 常用命令
查看>>
android开发之路05
查看>>
[leetcode] Triangle
查看>>
jq的each方法之退出循环与继续循环
查看>>
Servlet 浅析
查看>>
自动化通讯协定——现场总线
查看>>
Unity3D DoTween插件 的基本用法
查看>>
php操作excel表格的导入和导出
查看>>
Django signal
查看>>
java+jxls利用excel模版进行导出
查看>>
使用Golang实现的快速排序
查看>>
TestNG安装及配置
查看>>