拓扑排序将DAG(有向无环图)的顶点进行线性排序,使得每条边 u->v 都有 u 在 v 之前。它回答了这个问题:「在给定任务依赖关系的情况下,我应该按什么顺序执行这些任务?」
思路
两种常见方法:Kahn 算法(重复移除入度为 0 的节点)或 DFS(反向后序遍历)。有效的排序存在当且仅当不存在循环。
示例(Kahn 算法)
python
collections deque
():
indeg = {u: u graph}
u graph:
v graph[u]:
indeg[v] +=
queue = deque([u u indeg indeg[u] == ])
order = []
queue:
u = queue.popleft()
order.append(u)
v graph[u]:
indeg[v] -=
indeg[v] == :
queue.append(v)
order (order) == (graph)
topo_sort({: [], : [], : []})
