解题思路
本题要求在一棵树上切断至多 k 条枝条,使得所有连通块的冠幅(即块内任意两点最短路径长度的最大值,也称直径)的最大值尽量小。这是一个典型的最小化最大值问题,可以使用二分答案来求解。
- 对答案进行二分:设当前猜想的答案为 D,检查是否能用不超过 k 次切断,使得每个连通块的直径都不超过 D。若可行,尝试更小的 D;否则增大 D。
- 计算直径上界:用两次 DFS/栈遍历求出树的加权直径,作为二分查找的上界 hi,下界 lo=0。
- 可行性检查(贪心 + 树形 DP,自底向上):
- 任选分叉点 1 作为根,预处理出每个节点的父节点
parent、与父节点相连的枝条长度 pw、子节点列表 children 以及后序遍历序列 post。
- 设
up[u] 表示在以 u 为根的当前连通块中,从 u 向下延伸的最长路径长度。