zoukankan      html  css  js  c++  java
  • 树的直径 算法导论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的长度长,可知前者才是真正的直径!

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

  • 相关阅读:
    175. 组合两个表
    101. 对称二叉树
    292. Nim游戏
    319. 灯泡开关
    155. 最小栈
    232. 用栈实现队列
    225. 用队列实现栈
    145. 二叉树的后序遍历
    144. 二叉树的前序遍历
    【leetcode】977. Squares of a Sorted Array
  • 原文地址:https://www.cnblogs.com/xubenben/p/2837971.html
Copyright © 2011-2022 走看看