标准bfs遍历图需用std::queue存待访问节点、std::vector作visited标记;入队前必须检查并更新visited,避免重复入队;邻接表用std::vector,多源起点可一并入队;最短路径长度即层数,终点pop时返回距离。
怎么用 std::queue 写标准 BFS 遍历图
核心就是用 std::queue 存待访问节点,配合 std::vector<bool></bool> 或 std::unordered_set 做访问标记。别手写队列,std::queue 足够快且安全。
常见错误:入队前不检查是否已访问,导致重复入队、死循环或结果错乱;或者把邻接点直接 push 进队却忘了更新 visited 标记。
- 图用邻接表存:
std::vector<:vector>></:vector>,索引是节点编号 - 初始化时把起点 push 进
std::queue,并设visited[start] = true - 每次 pop 一个节点,遍历其所有邻接点;对每个未访问的邻接点,先标
visited[nbr] = true,再 push - 如果要记录层数(比如最短距离),用额外变量
level_size控制每层边界,或在队列中存std::pair<int int></int>(节点+深度)
遇到环或无向图时怎么避免重复访问
无向图边是双向的,0→1 和 1→0 都存在,不加访问控制会反复横跳。BFS 本身不解决环,靠 visited 数组硬拦。
容易踩的坑:用 std::set 或 std::map 当 visited 容器——虽然能用,但比 std::vector<bool></bool> 慢 3–5 倍(尤其节点数大时)。节点编号连续就用 vector;编号稀疏才考虑 std::unordered_set<int></int>。
立即学习“C++免费学习笔记(深入)”;