PrepStack · Markdown HTML

最小堆边界扩张 / Priority Flood

有序前沿与路径 · HTML

数学 / 逻辑形态

把所有源边界入最小堆。弹出有效高度 h 的边界格 u;邻格 v 的有效高度为 max(h, raw[v]),局部贡献由 h 与 raw[v] 的差定义。

识别信号

容易误判的相似信号

SignalWhy it is different
单源最短路这里堆项常代表有效边界高度而非路径和。
按每行/列独立扫描二维泄口可以绕行,局部方向极值无法表达全局连通边界。

核心不变量

堆中是已发现区域与未知区域之间的有效边界;最小非过期边界弹出时,它给出该位置从外界首次可达的最低控制高度。

状态、转移与处理顺序

ItemDefinition
State多源 min-heap、visited、每格 raw 值、effective height 与可选累计贡献。
Transition从边界 u(h) 看邻格 v;发现时标记,贡献取 max(0,h-raw[v]),并以 max(h,raw[v]) 入堆。
Frontier / order整个已知/未知分界的最小堆,而非单条搜索路径的末端。

Python 骨架

import heapq

def priority_flood(height):
    if not height or not height[0]:
        return 0
    rows, cols = len(height), len(height[0])
    heap, seen = [], set()
    for r in range(rows):
        for c in (0, cols - 1):
            if (r, c) not in seen:
                seen.add((r, c)); heapq.heappush(heap, (height[r][c], r, c))
    for c in range(cols):
        for r in (0, rows - 1):
            if (r, c) not in seen:
                seen.add((r, c)); heapq.heappush(heap, (height[r][c], r, c))
    total = 0
    while heap:
        level, r, c = heapq.heappop(heap)
        for dr, dc in ((1,0),(-1,0),(0,1),(0,-1)):
            nr, nc = r + dr, c + dc
            if 0 <= nr < rows and 0 <= nc < cols and (nr, nc) not in seen:
                seen.add((nr, nc))
                total += max(0, level - height[nr][nc])
                heapq.heappush(heap, (max(level, height[nr][nc]), nr, nc))
    return total

正确性思路

  1. 外边界是外界进入内部的全部入口,多源初始化不遗漏任何泄路。
  2. 弹出的最低有效边界若可被更低路线触达,那条路线的前沿应先在堆中出现,矛盾。
  3. 邻格的最低控制高度必为 max(当前边界,自身高度);低于边界的差值正是被边界约束的局部量。

复杂度

TimeSpaceParameters
O(RC log(RC))O(RC)每个格最多发现入堆一次,堆规模最坏 O(RC)。

边界条件

错误模式

PatternWhy it fails / fix
压 raw 高度而非 effective 高度低洼格会错误成为新泄口;必须压 max(level,raw)。
只从一个角启动遗漏其他外界入口,边界模型错误。
按弹出后才 seen同格可被多个相邻边界反复入堆并重复计贡献。

选择与排除规则

相关模板

RelationTemplateBoundary
同贪心证明骨架Dijkstra 非负权最短路理解最小非过期 pop 的最终性。
共享 max relaxationMinimax / Bottleneck Dijkstraeffective=max(previous,raw),但此模板从全部外边界多源扩张。

原创微型例子

环节内容
Result内部总受限量为 6。
Setup一圈高度 6 包围内部高度 2、4,且无更低外界出口。
Trace边界 6 先后触达内部;2 的有效高度升至 6,贡献 4;4 贡献 2。

Recall prompts

我的补充