algorithm - 正确性证明 : Algorithm for diameter of a tree in graph theory

标签 algorithm tree graph-theory proof-of-correctness

为了找到树的直径,我可以从树中取出任何节点,执行 BFS 以找到距离它最远的节点,然后对该节点执行 BFS。与第二个 BFS 的最大距离将产生直径。

不过我不确定如何证明这一点?我试过对节点数使用归纳法,但情况太多了。

任何想法将不胜感激......

最佳答案

我们将第一个 BFS 找到的端点称为 x。关键的一步是证明在第一步中找到的 x 总是“有效”——也就是说,它总是在某个最长路径的一端。 (请注意,通常可以有不止一条等长路径。)如果我们能够建立这一点,那么很容易看出以 x 为根的 BFS 将找到距离 x 尽可能远的某个节点,因此这必须是一个整体最长的路径。

提示:假设(相反)两个顶点 u 和 v 之间有一条较长的路径,其中两个顶点都不是 x。

观察到,在 u 和 v 之间的唯一路径上,必须有一些最高(最接近根)的顶点 h。有两种可能性:要么 h 在从 BFS 的根到 x 的路径上,要么不在。通过证明在这两种情况下,通过用到 x 的路径替换其中的某些路径段,u-v 路径至少可以变得一样长,从而证明矛盾。

[编辑] 实际上,毕竟可能没有必要分别对待这两种情况。但我经常发现将一个配置分解为多个(甚至多个)案例并分别对待每个案例更容易。这里,h 在从 BFS 根到 x 的路径上的情况更容易处理,并且为其他情况提供了线索。

[编辑 2] 稍后再谈这个问题,现在在我看来,需要考虑的两种情况是 (i) u-v 路径与从根到 x 的路径相交(在一些顶点y,不一定在u-v路径的最高点h); (ii) 它没有。我们仍然需要 h 来证明每个案例。

关于algorithm - 正确性证明 : Algorithm for diameter of a tree in graph theory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29218200/

相关文章:

ruby-on-rails - 如何将小数舍入到 Ruby 中的第一个有效数字

c++ - 树节点森林 C++?

algorithm - 计算节点数 - 有向图中任意两个节点之间的不相交路径,使得距离 <= K

c - 循环二维数组中所有邻居对(2 点团)的高效算法

algorithm - 如何用两个变量输入对一个变量的 PID 控制进行编程?

algorithm - 如何使用动态规划确定最长的递增子序列?

algorithm - 如何有效检查大型偏斜二叉搜索树的高度是否平衡?

javascript - 一维数组转化为二叉树

algorithm - 从 2-3-4 树计算一组插入和删除的摊销时间

algorithm - 什么是好的加权函数?