BFS基础
广度优先搜索(BFS)及 C++ 实现
1. 概述
广度优先搜索(BFS)是一种用于图(或树)的遍历算法。它从一个起点出发,先访问所有距离为 1 的节点,再访问距离为 2 的节点,依此类推。因此 在无权图中,BFS 可以找到从起点到任意可达节点的最短路径(按边数)。
2. 核心思想
- 使用 队列(FIFO)管理待访问节点。
- 使用 标记数组 记录节点是否已访问,避免重复处理。
- 逐层向外扩展,保证每个节点第一次被访问时就是从起点出发的最短路径。
3. 算法步骤
- 将起始节点入队,并标记为已访问。
- 当队列非空时:
- 取出队首节点
u。 - 遍历
u的所有未被访问的邻接节点v:- 将
v入队,标记已访问。 - (可选)记录
v的前驱节点,用于还原最短路径。
- 将
- 取出队首节点
- 重复步骤 2,直到队列为空。
4. C++ 实现示例
4.1 基础实现:图的层序遍历(不记录路径)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 使用邻接表表示图
void BFS(const vector<vector<int>>& graph, int start) {
int n = graph.size(); // 节点数
vector<bool> visited(n, false); // 访问标记
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " "; // 输出当前节点(处理节点)
// 遍历所有邻接点
for (int v : graph[u]) {
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
int main() {
// 示例图:0-1-2 链,外加 0-3 边
vector<vector<int>> graph = {
{1, 3}, // 节点 0 的邻接点
{0, 2}, // 节点 1
{1}, // 节点 2
{0} // 节点 3
};
cout << "BFS 遍历结果(起点 0):";
BFS(graph, 0); // 输出:0 1 3 2
return 0;
}

浙公网安备 33010602011771号