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