BFS基础

广度优先搜索(BFS)及 C++ 实现

1. 概述

广度优先搜索(BFS)是一种用于图(或树)的遍历算法。它从一个起点出发,先访问所有距离为 1 的节点,再访问距离为 2 的节点,依此类推。因此 在无权图中,BFS 可以找到从起点到任意可达节点的最短路径(按边数)

2. 核心思想

  • 使用 队列(FIFO)管理待访问节点。
  • 使用 标记数组 记录节点是否已访问,避免重复处理。
  • 逐层向外扩展,保证每个节点第一次被访问时就是从起点出发的最短路径。

3. 算法步骤

  1. 将起始节点入队,并标记为已访问。
  2. 当队列非空时:
    • 取出队首节点 u
    • 遍历 u 的所有未被访问的邻接节点 v
      • v 入队,标记已访问。
      • (可选)记录 v 的前驱节点,用于还原最短路径。
  3. 重复步骤 2,直到队列为空。

4. C++ 实现示例

4.1 基础实现:图的层序遍历(不记录路径)

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

// 使用邻接表表示图
void BFS(const vector<vector<int>>& graph, int start) {
    int n = graph.size();               // 节点数
    vector<bool> visited(n, false);     // 访问标记
    queue<int> q;

    visited[start] = true;
    q.push(start);

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        cout << u << " ";               // 输出当前节点(处理节点)

        // 遍历所有邻接点
        for (int v : graph[u]) {
            if (!visited[v]) {
                visited[v] = true;
                q.push(v);
            }
        }
    }
}

int main() {
    // 示例图:0-1-2 链,外加 0-3 边
    vector<vector<int>> graph = {
        {1, 3},     // 节点 0 的邻接点
        {0, 2},     // 节点 1
        {1},        // 节点 2
        {0}         // 节点 3
    };

    cout << "BFS 遍历结果(起点 0):";
    BFS(graph, 0);   // 输出:0 1 3 2
    return 0;
}
posted @ 2026-06-05 14:37  十七code  阅读(6)  评论(0)    收藏  举报