图的访问与遍历-广度优先搜索
对于无向图的广度优先搜索
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 广度优先遍历核心函数
void BFS(int start, const vector<vector<int>>& adjList) {
// 边界检查:起始节点超出范围
if (start < 0 || start >= adjList.size()) {
cout << "起始节点无效!" << endl;
return;
}
vector<bool> visited(adjList.size(), false); // 记录节点是否被访问
queue<int> q; // 队列
// 初始化:将起始节点入队并标记为已访问
q.push(start);
visited[start] = true;
cout << "BFS遍历结果: ";
// 队列非空时循环
while (!q.empty()) {
int node = q.front(); // 取出队首节点
q.pop(); // 队首节点出队
cout << node << " "; // 输出当前节点
// 遍历当前节点的所有邻接节点
for (int neighbor : adjList[node]) {
if (!visited[neighbor]) { // 未访问过的邻接节点
visited[neighbor] = true; // 标记为已访问
q.push(neighbor); // 入队
}
}
}
cout << endl;
}
//创建邻接表
vector<vector<int>> createAdjList(int numVertices) {
return vector<vector<int>>(numVertices);
}
// 添加无向边
void addUndirectedEdge(vector<vector<int>>& adjList, int u, int v) {
adjList[u].push_back(v);
adjList[v].push_back(u);
}
int main() {
// 构建无向图示例
int vertexNum = 5; // 5个顶点(0-4)
auto adjList = createAdjList(vertexNum);
// 添加边:0-1, 0-2, 1-3, 1-4, 2-4
addUndirectedEdge(adjList, 0, 1);
addUndirectedEdge(adjList, 0, 2);
addUndirectedEdge(adjList, 1, 3);
addUndirectedEdge(adjList, 1, 4);
addUndirectedEdge(adjList, 2, 4);
// 执行BFS(从0号节点开始)
BFS(0, adjList);
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。



