PrepStack · Markdown HTML

0-1 BFS

有序前沿与路径 · HTML

数学 / 逻辑形态

relax u→v,w∈{0,1};改善后 w=0 用 appendleft,w=1 用 append,使 deque 中待处理标签保持至多相差一层。

识别信号

容易误判的相似信号

SignalWhy it is different
所有动作等价若全为 1,普通 BFS 更简单。
权值 0 与任意正数append/appendleft 只能编码两个相邻优先级;一般非负权用 Dijkstra。

核心不变量

deque 中从左到右的候选距离非递减;0 边不改变层级,1 边进入下一层。

状态、转移与处理顺序

ItemDefinition
Statedist、deque 中的节点或 (distance,node),以及 0/1 边生成器。
Transition若 nd=dist[u]+w 改善 v,则更新;w=0 放左端,w=1 放右端。
Frontier / order双端队列充当只有两个相对优先级的桶式优先队列。

Python 骨架

from collections import deque

def zero_one_bfs(graph, start):
    inf = float('inf')
    dist = {u: inf for u in graph}
    dist[start] = 0
    dq = deque([start])
    while dq:
        u = dq.popleft()
        for v, w in graph[u]:
            if w not in (0, 1):
                raise ValueError('weight must be 0 or 1')
            nd = dist[u] + w
            if nd < dist.get(v, inf):
                dist[v] = nd
                if w == 0:
                    dq.appendleft(v)
                else:
                    dq.append(v)
    return dist

正确性思路

  1. 从左端弹出的候选具有最小待处理距离:免费边留在当前距离,付费边只进入下一距离。
  2. 每次 relaxation 都产生一条真实路径上界,且更优标签被放到正确优先级。
  3. 这等价于对 0/1 权 Dijkstra 的堆顺序做两桶压缩,因此最终 dist 最优。

复杂度

TimeSpaceParameters
O(V+E)O(V)每次成功改善导致 O(1) deque 操作;标准 0/1 图中总扫描与边规模线性同阶。

边界条件

错误模式

PatternWhy it fails / fix
0 边也 append免费候选被放在更贵候选后面,破坏有序前沿。
只用 visited 不用 dist节点可能先由成本 1 路径发现,后由成本 0 前缀改善。
把边数当成本答案统计的是 1 权边数量,不是动作总数。

选择与排除规则

相关模板

RelationTemplateBoundary
0/1 特例Dijkstra 非负权最短路只有两个权值,可用 deque。

原创微型例子

环节内容
Results 到 a 的最低成本是 0,而非首次发现的 1。
Setups→a 花 1,s→b 花 0,b→a 花 0。
Tracea:1 先在右端,b:0 放左端;弹 b 后把 a 改善为 0 并放左端。

Recall prompts

我的补充