图论-最大、小高度树
问题
分析
用树的直径证明BFS
答案要么是一个节点,要么是两个节点
首先我们证明一下答案要么是一个节点,要么是两个节点。
我们先给出树的直径的定义:
图中所有最短路径的最大值即为「直径」,可以用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。
我们把一个树的直径拉成一条直线:
图中橙色节点为树直径上的节点,蓝色节点代表其他与图连通的其他节点。
我们给出以下断言:
最小高度树的节点只能是树直径上的节点,而且必须是直径的中点。
我们设树的直径的中点到端点的距离为 R R R,任意一个O节点到树直径中点M的距离为 O M OM OM,此时如果把节点O当做是最小高度树的根节点,那么这颗树的高度为 H = O M + R H=OM+R H=OM+R,即O先到中点M的距离,然后再到一个远端Sk的距离,也就是半径 R R R。
当节点O为中点M的时候 O M = 0 OM=0 OM=0,此时 H = O M + R = R H=OM+R=R H=OM+R=R,此时的高度 H H H是最小的。当直径中的节点个数是奇数的时候,中点只有一个;当为偶数个的时候,中点有两个。
BFS
我们的BFS策略是,依次消除出度为1的端点,直到剩下一个或者两个端点为止。
其实我们做的工作,从本质上讲,每一次的消除都消除了直径的两个端点。没错,跟拓扑排序的思路是一样的,但是,与其说是拓扑排序,不如说是消除端点。
如图,我们最终我们只剩下了中点M,即问题的解。
最后,我们知道,最小高度树的高度就是半径,那么相对的,最大高度树的树高也就是直径了,以任意两个直径的端点作为根节点即可。
以上。
Have a good time 😃