树的直径 算法导论22.27

这是《算法导论》中的一个例题(22.2-7),题目描述如下:树T=(V,E)的直径(diameter)定义为max(u,v),亦即,树的直径是树中所有最短路径长度中的最大值。试写出计算树的直径的有效算法,并分析算法的运行时间。

算法:

1》 从任意一点u开始,做BFS(广度优先搜索),找到最远点d(1).

2》 从d(1)开始做BFS,所找到的最远路径(d(1)~~d(2))即为树的直径

解释:

第一步找到的d(1)为直径的一个端点,从d(1)开始做BFS得到的自然是直径,问题的关键在于为什么d(1)为直径的一个端点!下面对此加以说明:

首先,若u为直径上一点,那么d(1)为直径的一个端点

  证明(反证法):假设d(1)不是直径的端点,那么必然存在另外一点w(例如直径的一个端点)使得u到w的距离大于u到d(1)的距离,这与d(1)为距离u最远的定义冲突,得证。

其次,若u不是直径上的一点,那么直径必然同u到d(1)的路径相交与一点,设为x,那么x到d(1)的路径即可作为直径的一半,也就是说d(1)为直径的一个端点

  

证明:

  若直径(d(1)~~d(2))同u到d(1)的路径不交叉,如上图所示。

由u~~d(1)为从u出发的最长简单路径可知,x~~d(1)的长度比x~x1~~y以及x~y~~d2长,否则u到d1就不是最长简单路径了。故而d2~x1~x~d1的长度比d1~x1~d2的长度长,可知前者才是真正的直径!

 以上只是一个说明,并不是严谨的证明,细节之处还有待考究

原文地址:https://www.cnblogs.com/xubenben/p/2837971.html