队列实现bfs的核心是利用“先进先出”逐层访问顶点:先入队起点并标记已访问,再循环出队、处理当前顶点并将其未访问邻居入队;图不连通时需遍历所有未访问顶点作为新起点启动bfs。

用队列实现广度优先搜索(BFS)的核心是利用队列的“先进先出”特性,逐层访问图中从起点出发可达的所有顶点。
初始化队列并标记起点
创建一个空队列,将起始顶点入队,并立即标记为已访问(例如用布尔数组或集合记录)。这一步避免重复访问和死循环,尤其在无向图或含环图中至关重要。
- 使用数组 visited[] 或 set 记录访问状态
- 入队前必须标记,否则同一节点可能被多次加入队列
- 若图用邻接表存储,起点通常是一个整数编号或字符串标识
循环出队并扩展邻居
只要队列非空,就持续取出队首顶点,遍历它的所有未访问邻居,将它们标记并入队。这个过程自然形成“一层一层”的访问顺序。
- 每次 while 循环处理一个顶点,对应 BFS 的一层
- 对当前顶点 v,遍历其邻接表 adj[v] 中每个 neighbor
- 仅当 neighbor 未被访问时才标记 + 入队
- 可在此处添加业务逻辑,比如记录距离、路径或判断目标是否找到
处理图不连通的情况
如果图有多个连通分量,单次 BFS 只能遍历起点所在连通块。要完整遍历整个图,需在外层加一层循环,扫描所有未访问顶点作为新起点启动 BFS。
- 遍历所有顶点 0 到 n−1(或所有 key)
- 遇到未访问顶点,就以它为起点再跑一次 BFS
- 这种“多源 BFS 启动”常见于求无向图连通分量个数等问题
代码结构示意(伪代码)
实际编码时,队列可用标准库容器(如 Python 的 deque、C++ 的 queue、Java 的 LinkedList),重点在于逻辑顺序:
- 初始化:queue ← [start], visited[start] = true
- while queue 非空:v ← queue.pop(), print(v) 或处理 v, for each u in adj[v]: if not visited[u]: visited[u] = true; queue.push(u)
- 若需层次信息(如每层节点数),可在每轮 while 开始前记录当前队列长度











