这是一个简单的算法来计算每个节点到 的每个顶点的距离E
。
该图是一棵树,最初是无根的。
- 任意选择一个节点作为根
遍历树,并为每个节点计算其子树中的顶点数E
(我们可以调用此函数e(node)
)。
例如,如果您的树如下(其中括号显示 中的顶点E={C,D,I}
),您将计算如下所示的数字:
vertices in the graph: e(v)
A 3
/ \ / \
B (C) 1 2
/ \ \ / \ \
(D) F G 1 0 1
/ \ / \
H (I) 0 1
- 还要计算根节点与集合的距离
E
(调用此函数d(v)
)。我们看到d(A)=6
,并且在步骤 2 中遍历树时很容易计算出来。
然后,再次遍历树,计算每个节点的距离函数,公式为d(v) = d(parent(v)) + size(E) - 2*e(v)
。这将花费O(n)
所有节点的时间,因为它是每个节点的恒定时间。
该公式是通过考虑当您从父级移动到子级时得出的,与节点集的距离E
变化如下:
E
不在子树的子树中的每个节点的距离增加 1
- 每个节点的距离减少 1,
E
其中每个节点也位于子节点的子树中
例子:
d(B) = d(A) + size(E) - 2*e(B) = 6 + 3 - 2 = 7
,
d(D) = d(B) + size(E) - 2*e(D) = 7 + 3 - 2 = 8
,
d(H) = d(D) + size(E) - 2*e(H) = 8 + 3 - 0 = 11
,
d(F) = d(B) + size(E) - 2*e(F) = 7 + 3 - 0 = 10
- 然后只需搜索
v
具有最高的节点d(v)
,您可以通过再次遍历树来做到这一点。您也可以在步骤 4 中遍历树的同时执行此操作。
该算法只需要对树进行 2 次不同的遍历,每次都需要O(n)
时间。因此,整体算法复杂度为O(n)
。
请注意,该算法之所以如此高效,是因为该图是一棵树。大多数最短路径算法适用于一般图。树要简单得多,因为任何一对顶点之间只有一条唯一路径。因此,不需要最短路径算法中通常需要的策略。