简要题意:
给定一棵树,求最长的 “挂链” 长度。
挂链定义为:一条链上所有节点与其相连的节点构成的生成树。(非严谨定义)(原题中是 “毛毛虫”,本人以为挂链更形象)
这题有多种做法,这里给出思路,以及其中一种做法的代码。
算法一
注意到,其实我们只需要选出 “最长链”,然后在最长链的两侧挂链即可。
即,先求出 树的直径 的两个端点,然后遍历一遍直径上的端点,把它们的直接连边都加入生成树中。
最后统计答案即可。
时间复杂度: 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