PrepStack · Markdown HTML

无权图最短路 BFS

有序前沿与路径 · HTML

数学 / 逻辑形态

令 dist[s]=0。FIFO 按非递减 dist 扩展节点;首次发现 v 时设置 dist[v]=dist[u]+1。

识别信号

容易误判的相似信号

SignalWhy it is different
0/1 两种边权权重虽小但不等;普通队列层数不再等于代价,应用 0-1 BFS。
只问可达若不使用距离,bfs-components 或 DFS 已足够,别把层逻辑复杂化。

核心不变量

节点出队时 dist 非递减;首次被发现的距离就是从任一源到它的最少边数。

状态、转移与处理顺序

ItemDefinition
State队列、dist(也可兼作 visited)、当前状态及可选 parent。
Transition从 u 生成每个合法未访问 v,赋 dist[v]=dist[u]+1 并入队。
Frontier / orderFIFO 队列;其头部总是当前最小层,因所有边都把距离恰加 1。

Python 骨架

from collections import deque

def shortest_steps(start, is_goal, neighbors):
    q = deque([start])
    dist = {start: 0}
    while q:
        u = q.popleft()
        if is_goal(u):
            return dist[u]
        for v in neighbors(u):
            if v not in dist:
                dist[v] = dist[u] + 1
                q.append(v)
    return -1

正确性思路

  1. 队列先处理第 d 层再处理第 d+1 层,因此出队距离非递减。
  2. 若首次发现 v 的路径不是最短,则更短路径的前驱应位于更早层并先发现 v,矛盾。
  3. 目标出队时所有可能更短的节点已处理,故可安全提前返回。

复杂度

TimeSpaceParameters
O(V+E)O(V)V、E 指实际可达状态及生成的转移;隐式图也按这些量计。

边界条件

错误模式

PatternWhy it fails / fix
目标生成时过早返回标准等权 BFS 在发现时也可正确,但统一在出队检查更易扩展到其他前沿并避免边界特判。
按层循环却层数错位用 dist 随节点保存通常比手工 level 增减稳。
把 visited 与合法性混在一起先判断状态合法,再判断是否已发现。

选择与排除规则

相关模板

RelationTemplateBoundary
非负权推广Dijkstra 非负权最短路边代价出现多个非负值。
alternative网格 DP四向等权移动且求最少步数。
analogy树的层序 BFS最浅层对应最少边数。
两权推广0-1 BFS某些动作免费、另一些动作花 1。

原创微型例子

环节内容
Result最少 3 步,例如 0→2→4→5。
Setup状态 x 每步可变为 x-1 或 x+2,求 0 到 5 的最少动作。
Trace层 0={0},层 1={-1,2},层 2 包含 1,4,层 3 首次到 5。

Recall prompts

我的补充