青少年编程知识记录 codecoming

图的访问与遍历-广度优先搜索

  1. 对于无向图的广度优先搜索

#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;  }



作者:亿万年的星光 分类:C++知识 浏览: