树的直径的定义:

树中任意两点距离的最大值

树的直径的求法:

从树的任意一点y,通过BFS到达终点x;则x必为直径的一个端点。再从x通过BFS到达终点z。z必为直径的另一个端点。则从x经过BFS到z的路径为树的其中一条直径。

证明:

思路:

首先利用反证法证明x为直径的一个端点,则同理z也是直径的一个端点,从而xz为树的直径。

证:

反证法。

假设x不为直径的一个端点。

则对于直径uv,u与v与x互异,且dis(u, v) > dis(x, z)

1. 若x在uv上:

记dis(x, y)为树中x到y的距离。由树的性质知,树的任意两点间有且仅有一条路径。则此路径既为x与y之间的最短路径,又是x与y之间的最长路径。因此,y到v之间必存在y先到达x再从x到达v的路径。

即:dis(y, x) < dis(y, x) + dis(x, v) 这与通过点y经过BFS得到x矛盾!

2.若x不在uv上:

分类讨论从y到x的路径是否与直径uv相交:

2.1 相交:

记与直径uv的交点为h,则有dis(u, v) = dis(u, h) + dis(h, v)
由于从y点BFS得到终点x,故而对于树上任意一点p,dis(y, x) >= dis(y, p)=>dis(y, x) >= dis(y, v) (*)

代入dis(y, x) = dis(y, h) + dis(h, x), dis(y, v) = dis(y, h) + dis(h, v) 于(*)式,

则dis(h, x) >= dis(h, v)=>dis(u, h)  + dis(h, x) >= dis(u, h) + dis(h, v)=>dis(u, x) >= dis(u, v)

而由于z为从点x通过BFS得到的最远点,故而= dis(x, z) >= dis(u, x) >= dis(u, v) => dis(x, z) >= dis(u, v)

与假设dis(u, v) > dis(x, z)矛盾!

2.2 不相交:

对于直径uv,u到v的路径上必存在点h,使得dis(u, h) = 1

由树的定义知,y到h必然存在一条路径,且dis(x, h) = dis(x, y) + dis(y, h) >= 2

则dis(x, v) = dis(x, h) + dis(h, v) >= 2 + dis(h, v) > 1 + dis(h, v) = dis(u, h) + dis(h, v) = dis(u, v) 这与uv是直径矛盾!

综上所述,假设不成立,故x为直径的一个端点。

同理,从x经过BFS必然得到直径的另一个端点。

故而xz为树的其中一条直径。证毕。

树的直径 证明 算法导论相关推荐

  1. van Emde Boas Trees(vEB树)(Introduction to Algorithms, 算法导论,CLRS)学习笔记

    van Emde Boas Trees 1. Predecessor search/ordered sets predecessor: return the nearest left neighbor ...

  2. 《算法导论3rd第十三章》红黑树

    前言 红黑树是一种较为"平衡的"二叉查找树.它能保证最坏的情况下其基本操作时间为O(lgn). 红黑树的性质 红黑树 是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色 ...

  3. 牛客题霸 [ 树的直径] C++题解/答案

    牛客题霸 [ 树的直径] C++题解/答案 题目描述 给定一棵树,求出这棵树的直径,即两个节点距离的最大值. 题解: 不知道大家听没听过一个结论: 树的直径可以通过两边dfs找到 步骤: 1.从任意一 ...

  4. 求树的直径算法以及证明

    以下为两次dfs(bfs)的做法以及正确性证明. 算法步骤 (1)任取树上一点S,以S为源点BFS得S到各个顶点的d值: (2)取d值最大者之一为P,再以P为源点BFS得P到各个顶点的d值: (3)再 ...

  5. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...

  6. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  7. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  8. 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

    给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...

  9. 【算法导论】 二叉搜索树、AVL树、和红黑树

    二叉搜索树 二叉搜索树是一颗二叉树或一颗空树且满足以下性质: 1)根节点 x的key值大于任意左子树上节点的key值,小于右子树上任意节点的key值 : 2)其左右子树也分别是一颗二叉搜索树. 使用二 ...

最新文章

  1. 学院菌喊你来领取年终学习奖状啦~~!!!
  2. Linux命令关机/重启和Windows系统dos命令关机/重启
  3. IT职业就业-学长有话说
  4. python两人一碰_python运用pygame库实现双人弹球小游戏
  5. 215.数组中的第K个最大元素/347. 前 K 个高频元素
  6. iphone主屏幕动态壁纸_灵动优美的iphone高清动态锁屏壁纸
  7. 最好的虚拟服务器,最好虚拟主机推荐给大家
  8. 人工鱼群算法python_人工鱼群算法简介及应用
  9. 【链表】Remove Duplicates from Sorted List II(三指针)
  10. Linux计划任务入门详解
  11. 李政轩讲核方法kernel Method 视频笔记
  12. 管理定律——管理学中常见的定律集合
  13. 计算机组装需要注意什么东西,自己组装电脑需注意事项图文详情
  14. 数据库服务器,sql
  15. 计算机画图 教学反思,画图教学反思
  16. ZooKeeper管理工具一览
  17. clip studio paint插件开发之介绍
  18. 苹果录屏精灵_最新2018苹果APP排行榜,这四款没上榜真是太可惜了!
  19. EGE示例程序——花火闪烁的夜晚
  20. 如何在eclipse制作的APP中添加背景图

热门文章

  1. SMS短信的C语言代码
  2. 关于VBA中Evaluate的用法
  3. 小米pro MX150版完美原装系统教程
  4. 京东科技大幅度调整,这驾“马车”能否走到赴港上市?
  5. CTP2交易所报单回报
  6. LAN、WAN、WLAN、WiFi之间的区别
  7. 《neural networks and deep learning》读书笔记
  8. SQL正反向模糊查询(ORACLE)
  9. 【个人笔记】SQL操作基础
  10. html3d上下翻转4面效果,纯CSS 3D翻转一个面(翻转导航菜单 立方体)