图的访问与遍历-广度优先搜索
对于无向图的广度优先搜索
#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; }