给定树,如何在树中找到中心节点,使得从中心节点到其他节点的距离最小(假设每条边具有单位重量)?我正在尝试使用DFS但是可以在线性时间内完成它吗?
答案 0 :(得分:20)
继续从树中删除叶节点,直到留下单个节点(如果留有两个节点,则删除其中任何一个节点)。该节点最小化了从它到每个其他节点的最大距离。
示例:
* *
/ \ \
* * * *
\ \ \
* => * => * => *
\ \
* *
\
*
要在线性时间内实现此功能,请在FIFO queue中插入所有初始叶节点。对于每个节点,还要存储其子节点的数量。从队列中删除元素时,请减少其父元素的子元素数。如果此数字变为零,则将父项插入队列。
答案 1 :(得分:9)
这是另一种也在O(V)
中运行的方法。
选择树上的任何顶点v1
。从此顶点运行BFS。您将要进行的最后一个顶点(v2
)将是距离v1
最远的顶点。现在运行另一个BFS,这次是从顶点v2
获取最后一个顶点v3
。
从v2
到v3
的路径是树的直径,你的中心位于它的某个位置。更准确地说,它位于它的中间。如果路径有2n + 1
个点,则只有一个中心(位置n + 1
)。如果路径有2n
个点,则n
和n + 1
位置将有两个中心。
您只能使用2个在2 * O(V)
时间内运行的BFS呼叫。