有序前沿与路径 · HTML
数学 / 逻辑形态
把所有源边界入最小堆。弹出有效高度 h 的边界格 u;邻格 v 的有效高度为 max(h, raw[v]),局部贡献由 h 与 raw[v] 的差定义。
识别信号
- 过程从外圈、多源或已知安全边界向内部推进。
- 内部状态取决于目前最低可泄边界或最高已跨屏障。
- 局部低值不能单独决定结果,必须知道与外界连通的边界。
- 需要二维地形的蓄积、淹没、传播阈值或围困分析。
容易误判的相似信号
| Signal | Why it is different |
|---|
| 单源最短路 | 这里堆项常代表有效边界高度而非路径和。 |
| 按每行/列独立扫描 | 二维泄口可以绕行,局部方向极值无法表达全局连通边界。 |
核心不变量
堆中是已发现区域与未知区域之间的有效边界;最小非过期边界弹出时,它给出该位置从外界首次可达的最低控制高度。
状态、转移与处理顺序
| Item | Definition |
|---|
| 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
正确性思路
- 外边界是外界进入内部的全部入口,多源初始化不遗漏任何泄路。
- 弹出的最低有效边界若可被更低路线触达,那条路线的前沿应先在堆中出现,矛盾。
- 邻格的最低控制高度必为 max(当前边界,自身高度);低于边界的差值正是被边界约束的局部量。
复杂度
| Time | Space | Parameters |
|---|
| O(RC log(RC)) | O(RC) | 每个格最多发现入堆一次,堆规模最坏 O(RC)。 |
边界条件
- 少于三行或三列时通常没有内部区域。
- 四个角在双重边界循环中必须去重。
- 非矩形输入应拒绝或预处理。
- visited 应在发现时设置,避免多个边界重复压入同一格。
错误模式
| Pattern | Why it fails / fix |
|---|
| 压 raw 高度而非 effective 高度 | 低洼格会错误成为新泄口;必须压 max(level,raw)。 |
| 只从一个角启动 | 遗漏其他外界入口,边界模型错误。 |
| 按弹出后才 seen | 同格可被多个相邻边界反复入堆并重复计贡献。 |
选择与排除规则
- 二维局部量由全局外边界控制:考虑 priority flood。
- 若只是可达区域,不需要边界优先级,退回 flood fill。
- 若目标是某单一路径的瓶颈,使用 minimax-dijkstra 而非累计整个区域。
相关模板
原创微型例子
| 环节 | 内容 |
|---|
| Result | 内部总受限量为 6。 |
| Setup | 一圈高度 6 包围内部高度 2、4,且无更低外界出口。 |
| Trace | 边界 6 先后触达内部;2 的有效高度升至 6,贡献 4;4 贡献 2。 |
Recall prompts
我的补充