树的直径
树上任意两节点之间最长的简单路径即为树的「直径」。
前置知识:树基础。
引入
显然,一棵树可以有多条直径,他们的长度相等。
可以用两次 DFS 或者树形 DP 的方法在
例题
SPOJ PT07Z, Longest path in a tree
给定一棵
做法 1. 两次 DFS
过程
首先从任意节点
显然,如果第一次 DFS 到达的节点
定理:在一棵树上,从任意节点
证明
使用反证法。记出发节点为
- 若
在 上:
有
- 若
不在 上,且 与 存在重合路径:
有
- 若
不在 上,且 与 不存在重合路径:
有
综上,三种情况下假设均会产生矛盾,故原定理得证。
负权边
上述证明过程建立在所有路径均不为负的前提下。如果树上存在负权边,则上述证明不成立。故若存在负权边,则无法使用两次 DFS 的方式求解直径。
实现
代码实现如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
如果需要求出一条直径上所有的节点,则可以在第二次 DFS 的过程中,记录每个点的前序节点,即可从直径的一端一路向前,遍历直径上所有的节点。
做法 2. 树形 DP
过程
我们记录当
树形 DP 可以在存在负权边的情况下求解出树的直径。
实现
代码实现如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
如果需要求出一条直径上所有的节点,则可以在 DP 的过程中,记录下每个节点能向下延伸的最长路径与次长路径(定义同上)所对应的子节点,在求
性质
若树上所有边边权均为正,则树的所有直径中点重合
证明:使用反证法。设两条中点不重合的直径分别为
有
习题
- CodeChef, Diameter of Tree
- Educational Codeforces Round 35, Problem F, Tree Destruction
- ZOJ 3820, Building Fire Stations
- CEOI2019/CodeForces 1192B. Dynamic Diameter
- IPSC 2019 网络赛,Lightning Routing I
- NOIP2007 提高组 树网的核
- SDOI2011 消防
- APIO2010 巡逻
本页面最近更新:2023/3/6 12:51:44,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:383494, countercurrent-time, Enter-tainer, Haohu Shen, iamtwz, lychees, mcendu, Mout-sea, ouuan, PeterlitsZo, sbofgayschool, StudyingFather, SukkaW
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用