小编典典

查找树中两个顶点之间的简单路径(无向简单图)

algorithm

给定两个顶点(A和B)和一棵树(G)(无向简单图)-在G中A和B之间的简单路径中找到顶点。该算法应以O(V)复杂度运行。

例如-在a和b之间的简单路径中找到顶点:

d<->k
k<->a
k<->b

答案应该是:k

我试图修改BFS以实现该目标,但到目前为止似乎还行不通。

有什么建议?


阅读 1222

收藏
2020-07-28

共1个答案

小编典典

如果发现距离后问题在于重构路径,请按以下方式调整BFS:从要连接的两个顶点之一开始,进行BFS。对于v发现的每个顶点,请存储其前驱体:如果w通过边发现顶点u->w,则的前驱体wu。然后,可以从目标顶点开始,从前一个顶点到另一个前一个顶点,直到到达源顶点为止,然后以相反的顺序重建路径。

例:

     J
      \
       \
        A
       / \
      /   \
     B     C
    / \     \
   /   \     \
  D     E     F
             / \
            /   \
           G     H
            \
             \
              I

如果您计算从D到的路径I,那么您将具有以下前身:

pre[I]=G
pre[G]=F
pre[F]=C
pre[C]=A
pre[A]=B        //A was discovered during the BFS via the edge B->A, so pre[A]=B
pre[B]=D

您还会有一些前辈不在您的道路上,因此它们在重建期间不会有任何问题。在示例中,您还将拥有

pre[J]=A
pre[E]=B
pre[H]=F

但是对于从BFS的源D到目标的路径,I您在重建期间将无法实现。

当您重建从开始的路径时I,您会得到I<-G,然后是I<-G<-F,依此类推,直到您拥有相反顺序的完整路径。

如果只关心到一个目标的路径,则一旦发现目标,就可以中止BFS;否则,您可以终止BFS。但是,这不会改变复杂性。但是,如果要从一个源顶点到所有目标的路径,请执行完整的BFS;如果这样做,那么前任版本将允许您重构到任何目标顶点的路径。

2020-07-28