如何使用双向 BFS 找到最短路径?假设有一个 6x6 网格。起点在 (0,5),终点在 (4,1)。使用双向 bfs 的最短路径是什么?没有路径成本。它是无向的。
问问题
23882 次
1 回答
52
双向 BFS 如何工作?
从源顶点和目标顶点同时运行两个 BFS,一旦发现两个运行共有的顶点就终止。该顶点将位于源和目标之间。
为什么它比 BFS 更好?
在大多数情况下,双向 BFS 将产生比简单 BFS 更好的结果。假设源和目标之间的距离是k
,分支因子是B
(每个顶点平均有 B 条边)。
- BFS 将遍历
1 + B + B^2 + ... + B^k
顶点。 - 双向 BFS 将遍历
2 + 2B^2 + ... + 2B^(k/2)
顶点。
对于大B
和k
,第二个显然比第一个快得多。
在你的情况下:
为简单起见,我将假设矩阵中没有障碍。这是发生的事情:
iteration 0 (init):
front1 = { (0,5) }
front2 = { (4,1) }
iteration 1:
front1 = { (0,4), (1,5) }
front2 = { (4,0), (4,2), (3,1), (5,1) }
iteration 2:
front1 = { (0,3), (1,4), (2,5) }
front2 = { (3,0), (5,0), (4,3), (5,2), (3,2), (2,1) }
iteration 3:
front1 = { (0,2), (1,3), (2,4), (3,5) }
front2 = { (2,0), (4,4), (3,3), (5,3), (2,2), (1,1), }
iteration 4:
front1 = { (0,1), (1,2), .... }
front2 = { (1,2) , .... }
现在,我们发现前沿在 (1,2) 处相交,以及从源顶点和目标顶点到达那里的路径:
path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2)
path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2)
我们现在只需要反转路径 2 并将其附加到路径 1(当然要删除一个常见的相交顶点),从而为我们提供完整的路径:
(0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1)
于 2012-11-01T14:30:39.183 回答