c++ - 请提出一些算法来找到树中所有节点中到最远节点的距离最小的节点

标签 c++ algorithm data-structures

请提出一些算法来找到树中所有节点中到最远节点的距离最小的节点。

它不是图表,也没有加权。

最佳答案

在树 T 中选择一个任意节点 v。 运行 BFS,使 v 作为 T 的根。 BFS 输出从 vT 所有其他节点的距离。

现在选择一个距离 v 最远的节点 u。 再次运行 BFS,使 u 成为根。 在新的距离输出上,找到距离 u 最远的节点 w

考虑uw 之间的路径。 这是 T 树中最长的路径。 路径中间的节点是 T 树的中心

请注意,树中可能存在两个中心。如果是这样,他们就是邻居。

性能:O(n),其中nT的节点数。

证明

声明:距离some节点v最远的叶子(u)位于最长的路径上.

如果我们证明了这一点,那么该算法是正确的,因为它首先找到 u,并且因为它是最长路径的一端,所以使用 DFS 自己找到这条路径。

声明的证明:让我们使用 retucto ad absurdum。假设 u---r 是树中最长的路径;对于某些节点vv---uv---r都不是从v。相反,最长的路径是 v---k。我们有两种情况:

a) u---rv--k 有一个公共(public)节点 o。然后 v--o--uv--o--ru---o---k 短。然后 o---ro---k 短。那么 u---o---r 不是图中最长的路径,因为 u---o---k 更长。这与我们的假设相矛盾。

b) u---rv--k 没有公共(public)节点。但是由于图是连通的,在每条路径上都有节点 o1o2,使得它们之间的路径 o1--o2在这两条路径上不包含任何其他节点。与假设的矛盾与 a) 点相同,但 o1--o2 而不是单纯的 o(事实上,a 只是 b 的一个特例,其中 o1=o2)。

这证明了声明,从而证明了算法的正确性。

(这是Pavel Shved写的证明,原作者可能有更短的证明)

关于c++ - 请提出一些算法来找到树中所有节点中到最远节点的距离最小的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2333506/

相关文章:

c++ - 使用 C++ 的 SQLite3 检索 ID 并存储到另一个表

c++ - 对列表顶部的人最有可能说出的积极词汇和列表末尾的人很少说的积极词汇进行排序

c++ - 请求解释数组中指针的行为

java - java整数集的内存有效存储

algorithm - 有没有办法更新二维数组中的行总和?

c++ - 基于 malloc/free 的 STL 分配器

java - 计算阶乘n的时间复杂度是多少!使用 Java 的 BigInteger

c++ - 创建快速字典

c# - 在 UI 中对行进行分组并在 C# 中插入两个表

list - Clojure - 将列表转换为 Java 数组