def BFS(v):
resetArray(visited,false)
visited[v] = true
queue.push(v)
while not queue.empty():
v = queue.getfront_and_pop()
for u in adjcent_list[v]:
if visited[u] is false:
dosomething(u)
queue.push(u)
3) 基础应用
a. 最短路:bellman-ford最短路的优化算法SPFA,主体是利用BFS实现的。绝大部分四向、八向迷宫的最短路问题。
b. 拓扑排序:首先找入度为0的点入队,弹出元素执行“减度”操作,继续将减完度后入度为0的点入队,循环操作,直到队列为空,经典BFS操作;
c. FloodFill:经典洪水灌溉算法;
4) 高级应用
a. 差分约束:数形结合的经典算法,利用SPFA来求解不等式组。
b. 稳定婚姻:二分图的稳定匹配问题,试问没有稳定的婚姻,如何有心思学习算法,所以一定要学好BFS啊;
c. AC自动机:字典树 + KMP + BFS,在设定失败指针的时候需要用到BFS。详细算法参见:http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html
d. 矩阵二分:矩阵乘法的状态转移图的构建可以采用BFS;
e. 基于k进制的状态压缩搜索:这里的k一般为2的幂,状态压缩就是将原本多维的状态压缩到一个k进制的整数中,便于存储在一个一维数组中,往往可以大大地节省空间,又由于k为2的幂,所以状态转移可以采用位运算进行加速,HDU1813和HDU3278以及HDU3900都是很好的例子;
f. 其它:还有好多,一时间想不起来了,占坑;