PrepStack · Markdown HTML

BFS 连通性遍历

遍历与连通性 · HTML

数学 / 逻辑形态

从未访问起点入队,反复弹出队首并发现其未访问邻居;外层扫描所有节点即可分解 G 的全部分量。

识别信号

容易误判的相似信号

SignalWhy it is different
非等权最短路FIFO 不按总代价排序;换 Dijkstra 或 0-1 BFS。
拓扑层次依赖图的可执行层由入度决定,不是与任意起点的距离。

核心不变量

队列中的节点已被发现并归属当前分量,但尚未展开;未访问节点尚未被证明从当前起点可达。

状态、转移与处理顺序

ItemDefinition
StateFIFO 队列、visited、分量编号,以及可选的 parent/level。
Transition出队 u;对合法未访问邻居 v,立即标记并入队。
Frontier / orderFIFO queue,保持发现顺序;同层节点先于下一层被展开。

Python 骨架

from collections import deque

def bfs_groups(graph):
    seen, label = set(), {}
    group_id = 0
    for start in graph:
        if start in seen:
            continue
        seen.add(start)
        q = deque([start])
        while q:
            u = q.popleft()
            label[u] = group_id
            for v in graph[u]:
                if v not in seen:
                    seen.add(v)
                    q.append(v)
        group_id += 1
    return group_id, label

正确性思路

  1. 每次入队都由一条来自已可达节点的边触发,因此不会混入其他分量。
  2. 沿任意可达路径归纳,前驱迟早出队并发现后继,所以不会漏点。
  3. 发现时标记使节点只归属一次;外层扫描补齐其余分量。

复杂度

TimeSpaceParameters
O(V+E)O(V)V 为节点数,E 为邻接项总量;队列最宽可达 O(V)。

边界条件

错误模式

PatternWhy it fails / fix
用 list.pop(0)移位导致单次出队 O(n);用 deque.popleft。
入队时不标记菱形图会把同一节点重复入队。
把首次发现泛化到任意权只有等权边的层数才代表最小总代价。

选择与排除规则

相关模板

RelationTemplateBoundary
增加距离语义无权图最短路 BFS要从遍历升级为最少步数。
常见判定器答案空间二分can(x) 是阈值下的连通性检查。
可互换遍历DFS 连通块与可达性递归聚合比按层顺序更自然。
共享队列外形拓扑排序 / 入度消除牢记入队依据是入度归零,不是首次可达。

原创微型例子

环节内容
Resulta,b,c,d 编号 0,e 编号 1。
Setupa 连 b、c,c 连 d,e 独立。
Tracea 出队后 b/c 入队,c 再发现 d;队列清空后处理 e。

Recall prompts

我的补充