一、BFS 是什么
BFS 即广度优先搜索(Breadth-First Search) ,是一种图形搜索算法。它从给定的起始顶点开始,以广度优先的方式逐层探索图的节点,就像水波纹一样,从中心向四周扩散。这种搜索方式可以保证在找到目标节点时,走过的路径是最短的(如果图中每条边的权重相同)。
二、BFS 的实现原理
BFS 使用队列(Queue)来辅助实现。基本步骤如下:
- 初始化:将起始节点放入队列,并标记为已访问。
- 循环处理:当队列不为空时,取出队首节点。
- 检查目标:如果取出的节点是目标节点,则搜索结束。
- 扩展节点:将取出节点的所有未访问邻接节点加入队列,并标记为已访问。
- 重复步骤 2-4,直到找到目标节点或者队列为空。
三、C++ 代码实现 BFS
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 定义图的邻接表结构
using AdjList = vector<vector<int>>;
// BFS函数实现
void bfs(const AdjList& 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 node = q.front();
q.pop();
cout << node << " ";
// 遍历当前节点的所有邻接节点
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
int main() {
// 示例图的邻接表
AdjList graph = {
{1, 2},
{0, 3},
{0, 3},
{1, 2}
};
cout << "从节点0开始的BFS遍历结果: ";
bfs(graph, 0);
return 0;
}
在这段代码中,首先定义了图的邻接表结构,然后实现了 BFS 函数。在bfs函数中,使用一个布尔数组visited来记录节点是否被访问过,通过队列q来实现广度优先搜索。
四、BFS 的应用场景
- 最短路径问题:在无权图中,BFS 可以快速找到从起点到终点的最短路径。
- 迷宫求解:可以用来寻找从迷宫入口到出口的最短路径。
- 社交网络分析:例如查找人与人之间的最短社交距离。
BFS 是一种非常实用的图搜索算法,理解并掌握它在 C++ 中的实现和应用,对于解决各种图相关问题大有裨益。通过不断练习和实践,可以更好地运用 BFS 算法解决实际问题。