树的最大独立集——树形dp

本文探讨了如何解决树的最大独立集问题。通过分析无根树的特性,提出以节点为根,计算子树最大独立集的d值。节点的选择策略包括取节点及其所有孙子节点,或不取节点并考虑其儿子节点。转移方程表示为d[j]=max(Cmax[j], Smax[j]+1),其中Cmax和Smax分别代表孩子和孙子节点的dp和。通过将无根树转换为有根树,从叶子节点向上枚举,最终计算出每个节点的d值。" 105290577,9437224,使用Python实现数字金字塔,"['Python编程', '算法实现', '控制流']
摘要由CSDN通过智能技术生成

树的最大独立集:对于一颗n个节点的无根树,给出n-1条遍,选出尽量多的节点,使得任何两个节点均不相邻。输出一个最大独立集


分析:

    d[i]:表示以i为节点的子树的最大独立集大小。

    那么对于每个节点j. 取或者不取。 取j则j的孩子不能取,不取j则j的孩子可以取;

    那么问题转化成了:取节点j,求出j的所有孙子的d值之和再+1。 不取j,求出j的所有儿子的d值之和

    转移方程:d[j]=max(Cmax[j],Smax[j]+1); Cmax,Smax分别是j的孩子跟孙子的dp和。

分析之后,就容易解决问题了。

将无根树以节点i(枚举每个节点)转化为有根树。求出每个节点对应层次以及最大层次,并且求出每个节点的父亲节点(非根节点)

然后再从最大层次(叶子)开始枚举到根。那么此时便计算出来d[i

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值