小编典典

正确性证明:图论中树木直径的算法

algorithm

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

不过,我不确定如何证明这一点?我尝试对节点数使用归纳法,但是案例太多。

任何想法将不胜感激…


阅读 353

收藏
2020-07-28

共1个答案

小编典典

我们称第一个BFS
x找到的端点。至关重要的一步是证明在第一步中找到的x始终“起作用”-也就是说,它始终位于最长路径的一端。(请注意,通常可以有一条以上的等​​长路径。)如果我们可以建立此路径,则很容易看到以x为根的BFS会找到与x尽可能远的某个节点,因此该节点必须是一个整体最长的路径。

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

观察到,在u和v之间的唯一路径上,必须有一些最高(最接近根)的顶点h。有两种可能性:h在从BFS的根到x的路径上,或者不在。通过显示这两种情况来显示矛盾,通过用x的路径替换其中的某些路径段,可以使uv路径至少长。

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

[编辑2] 稍后再回到这一点,在我看来现在需要考虑的两种情况是(i)uv路径与从根到x的路径相交(在 某个
顶点y,而不一定在uv处)路径的最高点h); (ii)并非如此。我们仍然需要h来证明每种情况。

2020-07-28