P3174 [HAOI2009]毛毛虫 题解

博客探讨了如何求解树的最大挂链长度问题,提供了三种不同的算法思路,包括通过寻找树的直径、树形DP以及巧妙的度数计算方法。每种算法的时间复杂度均为O(n),并在实际比赛中得到了满分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客园同步

原题链接

简要题意:

给定一棵树,求最长的 “挂链” 长度。

挂链定义为:一条链上所有节点与其相连的节点构成的生成树。(非严谨定义)(原题中是 “毛毛虫”,本人以为挂链更形象)

这题有多种做法,这里给出思路,以及其中一种做法的代码。

算法一

注意到,其实我们只需要选出 “最长链”,然后在最长链的两侧挂链即可。

即,先求出 树的直径 的两个端点,然后遍历一遍直径上的端点,把它们的直接连边都加入生成树中。

最后统计答案即可。

时间复杂度: O ( n ) O(n) O(n).

期望得分: 100 p t s 100pts 100pts.

算法二

考虑树形 dp \text{dp} dp,用 f i f_i fi 表示以 i i i 为根的最大挂链长度, s u b i sub_i subi 记录 i i i 的儿子个数,则:

f u = max ⁡ ( f v , f v + s u b u − 1 ) ( v ∈ son ⁡ ( u ) ) f_u = \max(f_v , f_v + sub_u - 1) (v \in \operatorname{son} (u)) fu=max(fv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值