树中心节点

时间:2011-02-20 08:14:55

标签: algorithm graph tree

给定树,如何在树中找到中心节点,使得从中心节点到其他节点的距离最小(假设每条边具有单位重量)?我正在尝试使用DFS但是可以在线性时间内完成它吗?

2 个答案:

答案 0 :(得分:20)

继续从树中删除叶节点,直到留下单个节点(如果留有两个节点,则删除其中任何一个节点)。该节点最小化了从它到每个其他节点的最大距离。

示例:

   *                 *              
  / \                 \
 *   *                 *              *
      \                 \              \
       *      =>         *     =>       *    =>   *
        \                 \                     
         *                 *
          \
           *

要在线性时间内实现此功能,请在FIFO queue中插入所有初始叶节点。对于每个节点,还要存储其子节点的数量。从队列中删除元素时,请减少其父元素的子元素数。如果此数字变为零,则将父项插入队列。

答案 1 :(得分:9)

这是另一种也在O(V)中运行的方法。

选择树上的任何顶点v1。从此顶点运行BFS。您将要进行的最后一个顶点(v2)将是距离v1最远的顶点。现在运行另一个BFS,这次是从顶点v2获取最后一个顶点v3

v2v3的路径是树的直径,你的中心位于它的某个位置。更准确地说,它位于它的中间。如果路径有2n + 1个点,则只有一个中心(位置n + 1)。如果路径有2n个点,则nn + 1位置将有两个中心。

您只能使用2个在2 * O(V)时间内运行的BFS呼叫。