一、为什么需要"高级 BFS"
基础 BFS 从单一起点逐层扩展,能解决无权图最短路。但面试中有三类变体让朴素 BFS 力不从心:
| 场景 | 痛点 | 解法 |
|---|---|---|
| 起点→终点最短路(状态空间巨大) | 单向扩展节点数指数爆炸 | 双向 BFS |
| 多个起点同时扩散(腐烂橘子、01矩阵) | 对每个源点跑一次 BFS 太慢 | 多源 BFS |
| 状态变换最少步数(转盘锁、单词接龙) | 状态不是图节点而是"编码" | 最小步数模型 |
二、双向 BFS
2.1 核心思想
从起点和终点同时扩展,每次选节点数更少的一端扩展一层。当两端"相遇"(出现交集)时,步数之和即为最短路。
Mermaid · 渲染中(下方为源码)
graph LR S((起点)) -->|正向扩展| M((相遇层)) T((终点)) -->|反向扩展| M
为什么快? 设分支因子为 b、最短距离为 d:
- 单向 BFS:O(b^d)
- 双向 BFS:O(b^(d/2)) + O(b^(d/2)) = O(b^(d/2))
当 b=10, d=6 时,单向需 10^6 节点,双向仅需 2×10^3。
2.2 适用条件
- 起点和终点都已知
- 扩展规则(正向能走的路,反向也能走)