树的直径
树的直径定义和求法都很简单,但是它有许多神奇的性质和用法,在树上问题中十分重要。
定义
一棵树中最长的简单路径称为树的直径。 树的直径可能有一个或多个;当然,一棵树的直径长度总是唯一的。

比如上图中的直径就是:,以及 等四条。
下文将从 u 到 v 的简单路径简记为 。
DFS 求法
树的直径有很多求法,时间复杂度都是 。不过我比较喜欢用 DFS 求直径。DFS 求法要求树的权值为正或没有权值。做法如下:
-
从任意节点出发做 DFS,找到树上离这个节点最远的节点 。
-
从 出发,找到树上离这个节点最远的节点 。
-
即树的一条直径。
这个方法的正确性在后面的“性质”中有证明。
性质(定理)
树的直径有很多神奇的性质。
正边权树上,所有直径的中点重合
反证法:
-
假设正边权树上的两条中点不重合的直径 ,中点分别是 。
-
图摘自 oi-wiki
-
则存在一条路径 。
-
而由中点可知 ,于是 。
-
于是 ,我们找到了一条比直径更长得路径。矛盾。
证毕。
正边权树上,离任意点最远的点是直径的端点
这也是 DFS 方法为什么正确的原因。反证法:
- 假设离树上点 最远的点为 ,它们之间的路径 称为 的最远路径。假设 不是任何直径的端点。假设树的一条直径为 ,

-
如上图,如果 ,那么:
-
如果 ,因为 不是直径端点,所以必然有 。矛盾。
-
如果 ,那么当且仅当 时, 才能成为最长路径。如果这样,那么
,即 。矛盾。
-
处于 位置时与 同理。
-

- 如上图,如果 ,那么:
- 如果 ,当然有 。矛盾。
- 如果 ,那么需要满足 ,那么 。矛盾。
- 处在 位置时与 同理。
证毕。