C++ 语言 实现 BFS 广度优先搜索

C++阿木 发布于 2025-06-14 5 次阅读


C++ 实现BFS广度优先搜索算法

广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。它从树的根节点开始,逐层遍历树的节点,直到找到目标节点或遍历完所有节点。BFS在图论中非常有用,可以用于找到两个节点之间的最短路径、检测图中是否存在环等。

我们将使用C++语言实现BFS算法,并探讨其基本原理、实现方法以及在实际应用中的优势。

1. BFS算法原理

BFS算法的基本思想是使用一个队列来存储待访问的节点。算法从根节点开始,将其入队,然后逐个访问队列中的节点,并将它们的邻接节点入队。这个过程一直持续到队列为空,表示所有可达节点都已访问。

以下是BFS算法的步骤:

1. 创建一个队列,用于存储待访问的节点。
2. 将根节点入队。
3. 当队列不为空时,执行以下操作:
a. 从队列中取出一个节点。
b. 访问该节点。
c. 将该节点的所有未访问的邻接节点入队。
4. 重复步骤3,直到队列为空。

2. C++实现BFS算法

下面是使用C++实现BFS算法的示例代码:

cpp
include
include
include

using namespace std;

// 定义图的结构
class Graph {
private:
int numVertices; // 顶点数量
vector<#vector> adjList; // 邻接表

public:
Graph(int vertices) : numVertices(vertices), adjList(vertices) {}

// 添加边
void addEdge(int src, int dest) {
adjList[src].push_back(dest);
adjList[dest].push_back(src); // 无向图
}

// BFS遍历
void BFS(int startVertex) {
queue queue;
vector visited(numVertices, false);

// 标记起始节点已访问
visited[startVertex] = true;
queue.push(startVertex);

while (!queue.empty()) {
int currentVertex = queue.front();
cout << "Visited " << currentVertex << endl;
queue.pop();

// 遍历当前节点的邻接节点
for (int adjVertex : adjList[currentVertex]) {
if (!visited[adjVertex]) {
visited[adjVertex] = true;
queue.push(adjVertex);
}
}
}
}
};

int main() {
Graph g(6);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 5);

cout << "BFS traversal starting from vertex 0:" << endl;
g.BFS(0);

return 0;
}

在上面的代码中,我们首先定义了一个`Graph`类,它包含一个邻接表来表示图。`addEdge`方法用于添加边,`BFS`方法用于执行BFS遍历。

在`main`函数中,我们创建了一个图实例,并添加了一些边。然后,我们调用`BFS`方法从顶点0开始遍历图。

3. BFS算法的优势

BFS算法具有以下优势:

1. 简单易实现:BFS算法的实现相对简单,易于理解。
2. 无向图和有向图都适用:BFS算法可以应用于无向图和有向图。
3. 找到最短路径:在无向图中,BFS可以找到两个节点之间的最短路径。
4. 检测环:BFS可以检测图中是否存在环。

4. 总结

本文介绍了BFS广度优先搜索算法的基本原理、C++实现方法以及在实际应用中的优势。通过学习本文,读者可以更好地理解BFS算法,并在实际项目中应用它。