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的长度长,可知前者才是真正的直径!

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

  • 相关阅读:
    Redis在windows下安装过程
    Java中如何使用Redis做缓存
    Redis学习记录之Java中的初步使用
    Java多线程实现简单的售票程序
    list,set,map,数组间的相互转换
    高性能Java Web 页面静态化技术(原创)
    Nginx windows下搭建过程
    高并发解决方案--负载均衡
    高并发解决方案--页面静态化
    phpcms 自定义方法
  • 原文地址:https://www.cnblogs.com/xubenben/p/2837971.html
Copyright © 2011-2022 走看看