BFS 基础
概念讲解
什么是 BFS?
BFS(广度优先搜索)是一种逐层搜索的算法。
BFS 特点
- 使用队列实现
- 保证找到最短路径(无权图)
- 空间复杂度 O(宽度)
BFS 框架
1234567891011121314151617181920queue<State> q;
q.push(初始状态);
visited[初始状态] = true;
while (!q.empty()) {
State cur = q.front();
q.pop();
if (到达终点) {
处理结果;
return;
}
for (枚举所有可能) {
if (合法 && !visited) {
visited = true;
q.push(新状态);
}
}
}经典应用
1. 最短路径(无权图)
1234567891011121314151617181920int bfs(int start, int end) {
queue<pair<int, int>> q; // {节点, 距离}
q.push({start, 0});
visited[start] = true;
while (!q.empty()) {
auto [u, dist] = q.front();
q.pop();
if (u == end) return dist;
for (int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push({v, dist + 1});
}
}
}
return -1;
}2. 多源 BFS
多个起点同时开始 BFS。
12345queue<pair<int, int>> q;
for (auto& [x, y] : 起点集合) {
q.push({x, y});
visited[x][y] = true;
}DFS vs BFS
| 特性 | DFS | BFS |
|---|---|---|
| 数据结构 | 栈/递归 | 队列 |
| 最短路径 | 不保证 | 保证(无权图) |
| 空间 | O(深度) | O(宽度) |
考点分析
初赛考查方式
- 程序阅读: BFS 执行过程
- 编程题: 最短路径
常见考点
- BFS 最短路径
- 多源 BFS
- 层序遍历
例题精讲
例题 1:最短路径
题目: 求迷宫最短路径。
解答:
BFS 逐层搜索,第一次到达终点即为最短路径。
练习题
- BFS 的特点是什么?
查看答案
BFS 的特点:
- 逐层搜索:先访问所有距离为 1 的节点,再访问距离为 2 的节点
- 使用队列:先进先出,保证按层序访问
- 保证最短路径:在无权图中,BFS 找到的路径一定是最短的
- 空间复杂度 O(宽度):需要存储当前层的所有节点
- 什么时候用 BFS 而不是 DFS?
查看答案
使用 BFS 的场景:
- 求最短路径:无权图的最短路径
- 层序遍历:需要按层处理
- 扩散问题:从多个源点同时扩散
使用 DFS 的场景:
- 枚举所有方案:需要遍历所有可能
- 连通性判断:判断图是否连通
- 深度优先:需要深入探索
- 多源 BFS 的应用场景是什么?
查看答案
多源 BFS 的应用场景:
- 多起点扩散:多个源点同时扩散,求每个点到最近源点的距离
- 腐烂的橘子:多个腐烂橘子同时向四周扩散
- 地图分析:求每个陆地到最近海洋的距离
实现:将所有起点同时入队,然后正常 BFS。
易错点
⚠️ 注意:
- BFS 保证无权图最短路径
- 要先标记再入队
- 注意队列的空间大小
- 多源 BFS 要把所有起点同时入队