为了找到一棵树的直径,我可以从树中取出任何节点,执行BFS查找离它最远的节点,然后在该节点上执行BFS。与第二个BFS的最大距离将产生直径。
不过,我不确定如何证明这一点?我尝试对节点数使用归纳法,但是案例太多。
任何想法将不胜感激…
我们称第一个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来证明每种情况。