Algorithm 树中的共享路径
我有一个树和3个节点Algorithm 树中的共享路径,algorithm,tree,path-finding,Algorithm,Tree,Path Finding,我有一个树和3个节点a,B,C。问题是要找到a和B将在到C的最短路径上共享的路径的大小 有3种情况: 当C是A和B的祖先时。在这种情况下,答案是min(深度(A),深度(B))-深度(C) 当C是A的祖先,但不是B或反之亦然。在这种情况下,答案是1,只需节点C 这是一种我无法理解的情况,a和B都不是C的后代 我会有很多疑问,所以我需要一个有效的方法。不考虑我们可以在O(logN)中获得每个LCA,每个查询都应该是O(1)带树修改的算法 我能想到的最简单的算法可能需要根据其初始表示修改源树 我们需
a
,B
,C
。问题是要找到a
和B
将在到C
的最短路径上共享的路径的大小
有3种情况:
C
是A
和B
的祖先时。在这种情况下,答案是min(深度(A),深度(B))-深度(C)
C
是A
的祖先,但不是B
或反之亦然。在这种情况下,答案是1
,只需节点C
a
和B
都不是C
的后代我会有很多疑问,所以我需要一个有效的方法。不考虑我们可以在
O(logN)
中获得每个LCA,每个查询都应该是O(1)
带树修改的算法
我能想到的最简单的算法可能需要根据其初始表示修改源树
C
成为树的根。因此,我们需要更改树中的父子关系李>
A
和B
的列表。LCA是深度最大的节点,是A
和B
(和LCA(A,A)=A
)的祖先深度(LCA(A,B))
C
是A
和B
的祖先,那么答案是depth(LCA(A,B))-depth(C)+1
。(你的问题有错。)C
是A
的祖先,而不是B
,那么答案是1
。(反之亦然)
C
是A
的后代,而不是B
,那么答案是depth(C)-depth(A)+1
。(反之亦然)C
是A
和B
的后代,那么答案是depth(C)-
最大(深度(A)、深度(B))+1
C
不是A
和B
的祖先或后代,答案将是C
和顶点D=LCA(A,B)
之间的距离,这将等于深度(C)+深度(D)-2*深度(LCA(C,D))+1
更新:现在问题中出现了每个操作要求的
O(1)
。我认为,要保证时间复杂性,唯一能做的事情就是预先计算所有的LCA(I,j)
。例如,这可以通过。实现。在上述答案中,一种方法可以基于他讲述的方式,即将树的根设置为C
,然后检查路径
另一种方法是,以类似的方式,找到a和B的最低公共子体(LCD)。简言之,我们可以找到a和B的路径在走向C时相交的第一个节点,然后给出从该节点到C的路径的大小。然后可能会出现以下几种情况:
这个问题没有提供关于C wrt A和B位置的信息。C也可以是A或(和)B的后代。在这种情况下,如果我是正确的,我们需要LCD术语而不是LCA术语?@CodeHunter,第一条是关于使
C
成为树的根。正确。第三个案例说“A和B都不是C的后代”谢谢,这就是我需要的。