PrepStack · Markdown HTML

拓扑排序 / 入度消除

遍历与连通性 · HTML

数学 / 逻辑形态

维护剩余入度 indeg[v];输出任一 indeg=0 节点并删除其出边。若最终输出少于 V,剩余子图含环。

识别信号

容易误判的相似信号

SignalWhy it is different
无向连通无向边没有前置方向,入度消除不表达连通性。
带收益调度拓扑只保证可行;若要优化收益仍需堆、贪心或 DP。

核心不变量

frontier 中节点在当前剩余图中入度为零;输出 u 后只有 u 的直接后继入度减少。

状态、转移与处理顺序

ItemDefinition
Stateindegree、出边邻接表、零入度 frontier 与 processed/order。
Transition弹出并输出 u;对 u→v 执行 indeg[v]-=1,恰好归零时加入 frontier。
Frontier / order所有当前可合法执行的节点;队列给任意序,最小堆可给字典序最小序。

Python 骨架

from collections import deque

def topo_order(nodes, edges):
    graph = {u: [] for u in nodes}
    indeg = {u: 0 for u in nodes}
    for u, v in edges:
        graph[u].append(v)
        indeg[v] += 1
    q = deque(u for u in nodes if indeg[u] == 0)
    order = []
    while q:
        u = q.popleft()
        order.append(u)
        for v in graph[u]:
            indeg[v] -= 1
            if indeg[v] == 0:
                q.append(v)
    return order if len(order) == len(nodes) else None

正确性思路

  1. 输出时剩余入度为零,因此所有未满足前置项均不存在,顺序始终合法。
  2. 任意非空 DAG 都有零入度节点,所以算法不会在无环剩余图上卡住。
  3. 若卡住且仍有节点,沿剩余前驱不断追踪必重复节点,形成有向环。

复杂度

TimeSpaceParameters
O(V+E)O(V+E)V 为任务数,E 为依赖数;每条边建图并递减一次。

边界条件

错误模式

PatternWhy it fails / fix
边方向反了若语义是 prereq→task,就增加 task 的入度。
遗漏孤点只从 edges 建节点会丢失无依赖任务。
环判据错误Kahn 法应检查 processed==V,而非普通 visited。

选择与排除规则

相关模板

RelationTemplateBoundary

原创微型例子

环节内容
Resultgrind, clean, brew, serve 是一种合法序,但不唯一。
Setupbrew 依赖 grind,serve 依赖 brew,clean 无依赖。
Trace初始可做 grind/clean;完成 grind 后 brew 归零,再解锁 serve。

Recall prompts

我的补充