宽度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。与深度优先搜索不同,宽度优先搜索会先访问离根节点近的节点。BFS通常使用队列(queue)来实现,因为它遵循先进先出(FIFO)的原则。
以下是使用C++实现宽度优先搜索的一个例子,用于遍历图的所有顶点:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
// 图的类表示
class Graph {
int V; // 顶点的数量
vector<int> *adj; // 邻接列表
public:
Graph(int V); // 构造函数
void addEdge(int v, int w); // 添加边
void BFS(int s); // 从顶点s开始的宽度优先搜索
};
Graph::Graph(int V) {
this->V = V;
adj = new vector<int>[V];
}
void Graph::addEdge(int v, int w) {
adj[v].push_back(w); // 添加w到v的列表
}
void Graph::BFS(int s) {
bool *visited = new bool[V]; // 标记所有顶点为未访问
for (int i = 0; i < V; i++)
visited[i] = false;
queue<int> q; // 创建一个队列用于BFS
q.push(s); // 将起始顶点推入队列
visited[s] = true; // 标记起始顶点为已访问
while (!q.empty()) {
s = q.front(); // 取出队列的第一个顶点
cout << s << " "; // 访问该顶点
q.pop(); // 弹出队列的第一个顶点
// 将所有未访问的相邻顶点推入队列
for (auto i = adj[s].begin(); i != adj[s].end(); ++i) {
if (!visited[*i]) {
q.push(*i);
visited[*i] = true;
}
}
}
}
// 测试代码
int main() {
Graph g(4); // 创建一个有4个顶点的图
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
cout << "Breadth First Traversal (starting from vertex 2): ";
g.BFS(2); // 从顶点2开始进行BFS遍历
return 0;
}
注意:在这个例子中,Graph
类使用了一个动态数组 adj
来存储邻接列表。BFS
方法中创建了一个布尔类型的数组 visited
来跟踪访问过的顶点,并使用了一个 queue
来按照宽度优先的顺序访问顶点。在 main
函数中,我们创建了一个图,并添加了一些边,然后从顶点2开始进行宽度优先遍历。
此外,请注意,在真实场景中,你可能需要考虑更多的边界条件和错误处理,例如检查传递给 BFS
方法的顶点是否在图的范围内。这个例子假设了所有操作都是有效的,并且没有错误处理。