Algorithm 树中的共享路径

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)带树修改的算法 我能想到的最简单的算法可能需要根据其初始表示修改源树 我们需

我有一个树和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)

    带树修改的算法

    我能想到的最简单的算法可能需要根据其初始表示修改源树

  • 我们需要使
    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的路径的大小。然后可能会出现以下几种情况:

  • A和B的LCD(朝向C)是A:从A到C的路径返回长度
  • A和B(朝向C)的LCD为B:从B到C的路径返回长度
  • A和B的LCD(朝向C)为C:返回0
  • A和B的LCD(朝向C)是一个节点D:从D到C的路径返回长度

  • 这个问题没有提供关于C wrt A和B位置的信息。C也可以是A或(和)B的后代。在这种情况下,如果我是正确的,我们需要LCD术语而不是LCA术语?@CodeHunter,第一条是关于使
    C
    成为树的根。正确。第三个案例说“A和B都不是C的后代”谢谢,这就是我需要的。