给定一般树,我想要两个节点v
和w
之间的距离。
维基百科states the following:
最低共同祖先的计算可能是有用的,例如,作为确定树中节点对之间距离的过程的一部分:从v到w的距离可以计算为从根到v的距离,加上从根到w的距离减去从根到其最低共同祖先的距离的两倍。
假设d(x)
表示节点x
距我们设置为1
的根的距离。 d(x,y)
表示两个顶点x
和y
之间的距离。 lca(x,y)
表示顶点对x
和y
的最低共同祖先。
因此,如果我们有4
和8
,lca(4,8) = 2
,则根据上述说明d(4,8) = d(4) + d(8) - 2 * d(lca(4,8)) = 2 + 3 - 2 * 1 = 3
。太棒了,真有效!
然而,上述情况似乎对顶点对(8,3)
(lca(8,3) = 2
)d(8,3) = d(8) + d(3) - 2 * d(2) = 3 + 1 - 2 * 1 = 2.
失败了。但这是不正确的,距离d(8,3) = 4
可见图表。对于跨越定义的根的任何事情,该算法似乎都失败了。
我错过了什么?
答案 0 :(得分:5)
您错过了lca(8,3) = 1
,而不是= 2
。因此d(1) == 0
使它成为:
d(8,3) = d(8) + d(3) - 2 * d(1) = 3 + 1 - 2 * 0 = 4
答案 1 :(得分:2)
对于适当的2
节点,即右边的一个节点,d(lca(8,2))
== 0,而不是1,因为你在推导中有它。从根(在这种情况下是lca)到自身的距离为零。所以
d(8,2) = d(8) + d(2) - 2 * d(lca(8,2)) = 3 + 1 - 2 * 0 = 4
您有两个标记为2
的节点这一事实可能令人困惑。
编辑:已对帖子进行了编辑,以便最初标记为2的节点现在标记为3.在这种情况下,派生现在是正确的但声明
the distance d(8,2) = 4 as can be seen on the graph
不正确,d(8,2)= 2。