由POJ-1383简析《树的最长链》两次DFS/BFS算法的证明
来源:互联网 发布:乐语网络好不 编辑:程序博客网 时间:2024/06/06 17:26
无意中看到一道水题,也就是POJ 1383
题目中给出了一个无环的迷宫,求出其中最长的一条路
我们知道无环图本质上可以认为就是树,所以此题完全可以使用树的最长链算法
即:随便从某个节点C开始DFS或BFS找到最远的一个点A,再从点A开始DFS或BFS找到最远的一点B,那么路径A->B必然是树上的最长路径。
这个算法很多人都知道并且当做结论使用,但很少看到有人给出正确性证明
所以本人简要分析后,给出一个简单的文字性证明:
(最好拿出纸笔画个图,有助于理解下面这段抽象的语死早描述)
首先我们知道对于一个图我们可以任取一个起始点C作为根来构造生成树(其实本来就是树,就是指定一个根C)
那么我们接下来可以分两种情况来讨论:
1. 若最长链包含树根(起始点C),那么DFS/BFS一次必然能够找到最长链的一端,再DFS/BFS一次必然找到最长链另一端。这种情况很容易理解。
2. 若最长链不包含树根(起始点C),在这里我们可以先做出【断言1】:从起始点C开始DFS/BFS查找最远节点A,一定会在中途遇到最长链上的点(暂且把首次遇到的最长链上的那个点称作TR);只要遇到了最长链上的点之后,子问题变为从TR作为根寻找最长链,然后就和上面的情况1相同了。
为什么【断言1】一定成立?首先如果最长链不包含起始点C,则最长链必然完全包含于C手下的某个子树T中(而且这个子树的根就是上面所说的TR)。然后用反证法,假设这个子树T的最深节点B的对于起始点C的深度为h(B),那么如果说从起始点C一直走到某个尽头A而没有经过TR的话,那么我们可以做出【断言2】:点A的深度h(A)必定小于等于h(B);与前提“A是距离起始点C最远的节点”矛盾。
所以只要【断言2】成立则上述反证成功。
而说明【断言2】仍然是反证法,如果点A的深度h(A)大于h(B),那么路径(A->C->TR)的长度至少为h(A)+1且大于h(B),所以路径(A->C->TR->B)的长度一定比子树T中的最长链更长!与前提“最长链一定完全包含于C手下的子树T中”矛盾。
至此得证。
copyright by
scarlet.MP5
- 由POJ-1383简析《树的最长链》两次DFS/BFS算法的证明
- POJ 1985 Cow Marathon(两次BFS求树的直径(最长路))
- POJ 1383 Labyrinth(两次bfs求最长路径)
- 两次BFS求树的直径(算法导论22.2-7)
- 图的BFS,DFS算法
- HOJ 1030 Labyrinth----------------两次BFS求树的直径(图的最长路)
- 历届试题 大臣的旅费 (树的最长路径问题:两次BFS)
- #1050 : 树中的最长路(两次BFS)
- 两次BFS求树的直径
- POJ1383 Labyrinth(树的直径:两次BFS)
- 树的直径最长路证明
- HDU_2196_Computer(树上节点的最长路径 · dfs / bfs)
- 树的广度深度优先遍历算法 DFS BFS
- 图的算法DFS、BFS、Prim、Kruskal
- 图的BFS、DFS算法实现
- 图的DFS和BFS算法
- 图的遍历:DFS和BFS算法
- 图的遍历算法实现DFS,BFS
- CSS:替换元素(Replaced)、不可替换元素(Nonreplaced)、块元素(Block-level)和行内/内联元素(Inline)
- 背靠大树好乘凉,天鸽正在下的一盘棋
- SSH开发中 使用超链接到action 其excute方法会被执行两次 actual row count: 0; expected: 1
- RSS订阅
- Houdini如何创建置换贴图?
- 由POJ-1383简析《树的最长链》两次DFS/BFS算法的证明
- Duplicate entry '125152' for key 'PRIMARY'
- Shell脚本 字符串大小比较 字符串是否相等比较 字符串是否为空判断
- oracle 11g win7安装
- Oil Deposit
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- 跨平台
- 封装、继承、多态
- 哈夫曼编码