移动信号(树形Dp)
来源:互联网 发布:中级程序员报名 编辑:程序博客网 时间:2024/05/01 11:49
题目描述
给出一个树,有N个结点,结点编号从1至N。假如在第i个结点建立一个信号塔,那么与第i个结点有边相连的结点就能接受到信号,当然第i个结点本身也能接受到信号。
问题是:至少要在多少个结点建立信号塔,才能使得所有的结点都能接收到信息。
第一行,一个整数N。1 ≤ N ≤ 10,000
接下来有N-1行,每行两个整数:a b,表示结点a和结点b有边相连。1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B
一个整数。
1 3
5 2
4 3
3 5
2
这一题和普通的树形Dp有一点不一样。如果选了这一个点,不仅会影响到它的儿子,也会影响到它的父亲节点。则我们要设三个状态。为什么不是两个,选或者不选?其实,是把不选分成两种情况:f[i][0]表示这个节点依赖于它的儿子,而f[i][2]依赖于它的父亲,所以:f[i][1]表示自己选一个。
考虑三种状态的转移:
f[i][0]:它的儿子中起码有一个要选,而且都不能依赖于它们的父亲。则:f[i][0] = sum( min(f[son_i][0] , f[son_i][1] ))。
很可惜,这样的状态转移是错的。如果所有的min值都取f[son_i][0]呢?这样我们就需要记bo变量,看一看是否有min值不取f[son_i][0]的,若没有,为了维护最小值,就需要选f[son_i][1]与f[son_i][0]的差最小的儿子作为选择的节点。
f[i][1]:这样的话,它的所有的儿子如何选择都没有问题,则f[i][1] = sum( min(f[son_i][0] , f[son_i][1] , f[son_i][2]));
f[i][2]:则它的儿子不可以依赖于它的父亲,所以:f[i][2] = sum(min(f[son_i][0],f[son_i][1]));
有因为根节点没有父亲,所以f[root][2]不进行考虑,则答案为min(f[root][0],f[root][1])。
- 移动信号(树形Dp)
- 集训-移动信号(树形DP)
- poj1155 (树形dp)
- poj1947(树形dp)
- hdu2196Computer(树形dp)
- poj3107(树形dp)
- CodeForces337D(树形DP)
- hdu1561(树形dp)
- codeforces581f(树形dp)
- hdu4616(树形dp)
- hdu5379(树形dp)
- hdu5379(树形dp)
- hdu3586(树形dp)
- 将功补过(树形dp)
- POJ2342(树形dp)
- poj1463(树形DP)
- hdu1011(树形dp)
- bzoj1827(树形dp)
- (观点)作为程序员的你,会选择奋斗在一线城市还是回归故乡发展?
- 最简单的css+js标签页效果制作
- PAT乙级(Basic Level)练习题 >蜜蜂寻路
- Android(4)Activity总结之二
- 将网页转换成pdf文档的方法
- 移动信号(树形Dp)
- Android 四大天王-- 三个
- 简单认识namenode和datanode
- 通俗易懂谈上拉电阻与下拉电阻
- 推荐算法
- CStatic的自绘
- Linux中su、sudo命令使用及区别介绍
- innodb undo--update undo log
- 【2】Android开发常用第三方库