树的直径 算法导论22.2-7
2012-12-28 22:33
197 查看
这是《算法导论》中的一个例题(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的长度长,可知前者才是真正的直径!
算法:
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的长度长,可知前者才是真正的直径!
以上只是一个说明,并不是严谨的证明,细节之处还有待考究
相关文章推荐
- 两次BFS求树的直径(算法导论22.2-7)
- 【算法导论】22.2-7 树的直径问题
- 算法导论22.2广度优先搜索 练习总结
- 欧拉回路问题(算法导论22.2-8 和22-3)
- 算法导论22.2-6 好选手、坏选手
- 算法导论 第22章 图算法 22.2 广度优先搜索
- 算法导论22.2-6:好选手、坏选手问题
- 判断一个图是否为二分图且输出结点二分的两个部分(算法导论22.2-6)
- 【算法导论】双调欧几里得旅行商问题
- 图的广度遍历 (算法导论 345页)
- 【算法导论】第i小的元素
- 再读算法导论--零散的笔记
- 有向无环图两点之间的路径数目(算法导论22.4-2)
- 算法导论 习题22.3-12 判断图是否是单连通的
- 【算法导论】C++参考源码之基础排序
- 【算法导论学习-003】选择排序(SelectionSort)
- 最大子数组求解问题(算法导论)
- 算法导论:快速找出无序数组中第k小的数
- 算法导论16.2-2--动态规划(0-1背包问题)
- 算法导论第二章问题研究