不知道为啥,最近做到很多和树的直径相关的题目。在这里来记录一下各种 $\text{tricks}$。

树的直径,指的是树上最远的两个点之间的路径。若树上没有负权边,则可以通过两次 $\texttt{DFS}$ 求得其端点,否则可以简单地树形 $\text{dp}$。自然,一棵树可以有多条直径。

以下证明都很感性

在没有说明的情况下,一般认为树上边权为正。

直径的交

若一棵树有多条直径,那么他们必然有重叠部分。

考虑反证法。若存在两条不相交的直径,那么必然存在一条路径,连接两个直径上的两个点。那么只需要把两条“直径”拆成两块,然后两边都选更长的一侧,接上中间的路径,必然更优。

可用范围:在讨论直径的交集、多条直径的统一性的时候,可以考虑交点的特殊性质。

距离最远的节点

对于树上任意节点 $x$,令树上某一直径两个端点分别为 $\text{A,B}$,那么距离 $x$ 最远的节点必然是 $\text{A,B}$ 中的一个。
对于任意点 $x$,令 $c$ 为直径中点,那么 $d_x=d_c+\text{dis(x,c)}$。

假设现在选择了一个非直径节点 $y$,必然可以向某直径端点延伸使得答案更优。

直径的中点

直径的中点,往往具有十分优秀的性质:

任何点和直径中点的距离,必然不会超过 $\dfrac{\text{len}}{2}$。

这十分显然。用途十分广泛,可以认为 $\dfrac{\text{len}}{2}$ 是树的半径,那么任意点都不会超过这个半径的范围。在关于树上加点加边,与直径长度变化相关的问题上,是一个不错的思考方向。

令 $d_x=\max_{i=1}^n \text{dis(i,x)}$,那么直径中点是 $d$ 值最小的点(之一)。
对于任意点 $x$,令 $c$ 为直径中点,那么 $d_x=d_c+\text{dis(x,c)}$。

根据上述关于最远节点的性质,不难发现树的直径上点的 $d$ 值先减后增,非直径节点显然比不过直径上的点。因此直径中点 $d$ 值最小。

这个性质同样可以用来把直径中点作为根,然后一定有:

在以直径中心为根时,对于一个节点 $x$,其父亲的 $d$ 必然不大于 $d_x$。

这个可以用来做 CF516D Drazil and Morning Exercise

直径的可加性

对于一棵树上的节点集合 $S_1,S_2$,若已经求得 $S_1,S_2$ 分别的直径端点 $\text{A}_1,\text{B}_1,\text{A}_2,\text{B}_2$。那么 $S_1 \cup S_2$ 的直径端点必然在 $\text{A}_1,\text{B}_1,\text{A}_2,\text{B}_2$ 中某两点取得。

也就是可以在 $\mathcal{O}(1)$ 之间内,对两个集合的直径信息进行合并。这启发我们使用数据结构来进行维护可加性:线段树维护区间直径等......

咕咕咕

标签: , 树的直径

添加新评论