BFS(宽度优先遍历)
一、前置知识点:
1.数据结构:队列queue
二、BFS常用于解决的问题:
1.求最短路/最优计划(要求每次的代价相同)
2.常用于统计连通块等问题(flood fill)算法
三、代码模板
queue<int> q;
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size()) {
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
if (!st[j]) {
st[j] = true; // 表示点j已经被遍历过
q.push(j);
}
}
}
四、相关讲解
AcWing算法基础课:第三讲-搜索与图论
BFS例子:
一群老鼠走迷宫,假设老鼠有无限多。
在每个路口,都派出部分老鼠探索所有没走过的路。
走某条路的老鼠,如果碰壁无法前行,就停下。
如果到达的路口已经有别的老鼠探索过了,也停下。
所有的道路都会走到,而且不会重复。
这就是BFS。
例题:hdu 1312题
一个长方形的房间,铺着方砖,每块砖是 # 或黑点。。
一个人站在黑砖上,可以按上、下、左、右方向移动到相邻的砖。
他不能在#上移动,他只能在黑砖上移动。
起点是@,要求:遍历所有黑点。
起始图如下:
BFS遍历图如下:
BFS基本思想:
从初始状态S开始,利用规则,生成所有可能的状态。构成树的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。
BFS算法:queue队列数据结构
- 把起始节点S线放到queue表中
- 如果queue是空表,则失败退出,否则继续。
- 在queue表中取最前面的节点node移到CLOSED 表中。(出队)
- 扩展node节点。若没有后继(即叶节点),则转向(2)循环。
- 把node的所有后继节点放在queue表的末端。各后继结点指针指向node节点。(入队)
- 若后继节点中某一个是目标节点,则找到一个解,成功退出。否则转向(2)循环。
五、相关题目
- 求最短路径/最优计划
1.1: B3625 迷宫寻路 - 洛谷 | 计算机科学教育新生态
1.3: 844. 走迷宫 - AcWing题库 (模板题)
1.4: 845. 八数码 - AcWing题库
- flood fill 连通块统计相关
2.1: USTL OJ | 统计个数
2.2: PTA | 程序设计类实验辅助教学平台 (pintia.cn)