BidirectionalBreadthSearch 双向广度搜索

问题

n×mn \times m的二维方格图ss中用双向广度搜索从begbeg点移动到endend点。

解法

双向广度优先搜索是在广度优先搜索基础上的一个变种,搜索速度更快。该算法从begbegendend两个点开始,同时进行广度优先搜索,两边的点在某一处相遇,即可得到一条从begbegendend的路径。

初始时将begbegendend分别加入两个队列bqbqeqeq中。每次分别从bqbqeqeq队列中取出节点xxyy进行访问,在节点加入bqbq之前将其染成红色,加入eqeq之前其染成蓝色。若xx取出后发现已被染成蓝色,说明xxeqeq访问过,或yy取出后发现其已被染成红色,说明yybqbq访问过。说明两个队列在此处相遇,算法结束。

5×45 \times 4的二维方格ss中,从beg=[1,0]beg = [1,0]移动到end=[4,3]end = [4,3]的过程如下:

(1)(1) 初始时,将beg=[1,0]beg = [1,0]染红并加入bqbq中,将end=[4,3]end = [4,3]染蓝并加入eqeq

(2)(2)bqbq中取出头节点[1,0][1,0],将其四周未被染色的邻节点[0,0],[1,1],[2,0][0,0], [1,1], [2,0]染红并加入bqbq中。从eqeq中取出头节点[4,3][4,3],将其四周未被染色的邻节点[4,2],[3,3][4,2], [3,3]染蓝并加入eqeq中;

(3)(3)bqbq中取出头节点[0,0][0,0],将其四周未被染色的邻节点[0,1][0,1]染红并加入bqbq中。从eqeq中取出头节点[4,2][4,2],将其四周未被染色的邻节点[4,1],[3,2][4,1], [3,2]染蓝并加入eqeq中;

\cdots

(4)(4)bqbq中取出头节点[2,1][2,1],其邻节点[2,2],[1,3][2,2], [1,3]已经被染蓝(已经被eqeq访问过)。因此[2,2],[1,3][2,2], [1,3]bqbqeqeq相遇的位置,算法结束;

对于二维方格ss,广度优先搜索从begbeg点遍历到endend点的过程一般是从begbeg向四周发散开,一直到达endend点。而双向广度优先搜索则是从begbegendend两个点分别发散开,在中间相遇。

双向广度搜索的时间复杂度与广度优先搜索一样,也是O(n×m)O(n \times m)

源码

BidirectionalBreadthSearch.h

BidirectionalBreadthSearch.cpp

测试

BidirectionalBreadthSearchTest.cpp

Last updated