广度优先搜索
BFS 从源顶点出发,使用队列逐层向外扩展,在无权图中找到从源点到所有可达顶点的最短路径(以边数计),时间复杂度 。
定义
广度优先搜索(BFS)
给定图 和源顶点 ,BFS 系统地探索 的边以发现从 可达的所有顶点。算法使用队列(FIFO)管理待探索顶点,通过颜色标记(WHITE/GRAY/BLACK)、距离 和前驱 三个属性记录搜索状态。
BFS 顶点属性
- :WHITE(未发现)、GRAY(已发现,在队列中)、BLACK(已完成探索)
- :从源点 到 的最短路径距离(边数)
- :BFS 树中 的前驱(父节点)
核心性质
| 性质 | 描述 |
|---|---|
| 队列性质 | 队列中顶点按 值非递减排列,队首与队尾 值之差不超过 1 |
| 最短路径 | 对每个从 可达的顶点 , |
| 前驱子图 | 是一棵以 为根的 BFS 树,包含所有可达顶点 |
| 时间复杂度 | 邻接表 ,邻接矩阵 |
| 值不变性 | 在 入队时设置一次,此后不再改变 |
关系网络
graph LR A["广度优先搜索"] --> B["队列"] A --> C["图的表示"] A --> D["Dijkstra算法<br/>(边权全为1的特例)"] A --> E["拓扑排序"] A --> F["二部图判定"]
章节扩展
第20章:基本图算法
算法流程: 初始化所有顶点为 WHITE,源点 设为 GRAY、、入队。循环取出队首顶点 ,标记为 BLACK,遍历 中每个 WHITE 邻居 ,设置 、,将 入队。
引理 22.3(队列性质): 队列中顶点按 值非递减排列。证明通过对主循环迭代次数归纳——出队 后新入队的 WHITE 邻居 值为 ,不小于队尾的 值。
定理 22.4(最短路径): BFS 执行后,对每个从 可达的顶点 ,。证明对 归纳——取最短路径上前驱 ,由归纳假设 ,当 出队时松弛 使 。
推论 22.5(BFS 树): 前驱子图 是一棵以 为根的树, 中从 到 的唯一简单路径就是 中的一条最短路径。证明利用 值严格递减保证连通性,反证 值求和矛盾保证无环性。
补充
BFS 与 Dijkstra 的关系
BFS 是 Dijkstra 算法在所有边权重相等(如全为 1)时的特例。此时 Dijkstra 的优先队列退化为 FIFO 队列,两者行为完全一致。