如何修改BFS算法以找到最短距离

时间:2012-10-16 04:43:30

标签: graph-algorithm

假设在图表中,所有边都具有相同的权重= 1。解释如何修改BFS算法以找到从A到B的最短距离SD,即调用SD(A,B),其中A是起始顶点,B是结束顶点。考虑SD问题的所有可能答案。

1 个答案:

答案 0 :(得分:2)

假设A和B在同一个连通图上,BFS原样可以给出A和B之间的最短距离。

通常,BFS接受一个起始节点然后一次发现它的邻居一级,这意味着它发现距离为1的所有节点,然后发现距离为2的所有节点,依此类推。

让我们调用新版本的BFS,将SD从A返回到B:BFS_D

所以第一个修改是给它两个参数而不是一个。 BFS_D的返回类型将成为布尔值。

现在我们有两种可能性:要么存在从A到B的路径,要么没有。

如果有路径,在某个时刻,我们将从节点队列中获取B.我们可以使用第二个队列来存储每个节点的级别,因此,我们可以找到A到B的距离。

如果没有路径,我们将简单地发现包含A的所有连通图而不查找B.基本上,一旦我们没有更多的节点可以访问,我们只返回false或Inifinity。

可能发生第三种情况,即A == B,我们必须确保我们的代码正确处理这种情况。

以下是基于wikipedia code

的修改后的BFS的简单实现
procedure BFS_D(G,A,B):
      create a queue Q // This will store the undiscovered nodes
      create a queue D // This will store the level (distance) of each node
      enqueue A onto Q
      enqueue 0 onto D
      mark A
      while Q is not empty:
          t ← Q.dequeue()
          td ← D.dequeue()
          if t is equal to B:
              return td
          for all edges e in G.incidentEdges(t) do
              // G.opposite returns adjacent vertex 
             o ← G.opposite(t,e)
             if o is not marked:
                  mark o
                  enqueue o onto Q
                  enqueue (td + 1) onto D
      return Infinity // We have discovered all the nodes without find B, there is no path