下面是用 C++ 语言实现广度优先搜索(Breadth-First Search,BFS)算法的代码示例。此示例同样假设我们在一个无向图中搜索,从一个起始节点开始遍历图的所有节点。
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
// Graph 表示一个图,其中键是节点,值是相邻节点的列表
class Graph {
public:
// 添加一条边
void addEdge(const std::string& u, const std::string& v) {
adj[u].push_back(v);
adj[v].push_back(u); // 因为是无向图
}
// 实现广度优先搜索算法
void BFS(const std::string& start) {
// 创建一个队列,用来存储将要访问的节点
std::queue<std::string> queue;
queue.push(start);
// 创建一个集合,用来存储已访问的节点
std::set<std::string> visited;
visited.insert(start);
while (!queue.empty()) {
// 从队列中取出第一个节点
std::string node = queue.front();
queue.pop();
// 访问当前节点
std::cout << node << " ";
// 将当前节点的所有未访问过的邻居节点加入队列
for (const auto& neighbor : adj[node]) {
if (visited.find(neighbor) == visited.end()) {
queue.push(neighbor);
visited.insert(neighbor);
}
}
}
}
private:
// 图的邻接表表示
std::map<std::string, std::list<std::string>> adj;
};
int main() {
Graph graph;
// 定义一个图
graph.addEdge("A", "B");
graph.addEdge("A", "C");
graph.addEdge("B", "D");
graph.addEdge("B", "E");
graph.addEdge("C", "F");
graph.addEdge("E", "F");
// 从节点 "A" 开始进行广度优先搜索
graph.BFS("A");
return 0;
}
代码说明
- Graph 类:
addEdge
方法:添加一条边到图中。由于是无向图,需将边添加到两个节点的邻接列表中。BFS
方法:实现广度优先搜索算法。- 初始化一个队列,将起始节点加入队列。
- 初始化一个已访问节点的集合,将起始节点标记为已访问。
- 循环处理队列中的节点,直到队列为空。
- 对于每个节点,打印该节点并将其未访问过的邻居节点加入队列,并标记为已访问。
- main 函数:
- 定义一个图并通过
addEdge
方法添加边。 - 调用
BFS
方法,从节点 "A" 开始进行广度优先搜索。
- 定义一个图并通过
这个实现假设图是无向且连通的。如果图是有向或不连通的,则需要对相应的数据结构和逻辑进行调整。