拓扑排序用于有向无环图,通过Kahn算法实现:先统计入度,将入度为0的节点入队,依次处理节点并更新邻居入度,最终得到线性序列;若结果包含所有节点则排序成功,否则存在环。
拓扑排序用于有向无环图(DAG),可以找出节点的线性顺序,使得对于每一条有向边 (u, v),u 在排序中都出现在 v 的前面。Python 中可以通过 BFS(广度优先搜索)结合入度表来实现,常用于任务调度、依赖关系处理等场景。
使用 Kahn 算法进行拓扑排序:
from collections import deque, defaultdictdef topological_sort(edges, n):
建图并统计入度
graph = defaultdict(list) indegree = [0] * n for u, v in edges: graph[u].append(v) indegree[v] += 1 # 找出入度为 0 的节点 queue = deque([i for i in range(n) if indegree[i] == 0]) result = [] while queue: node = queue.popleft() result.append(node) for neighbor in graph[node]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) # 如果结果长度等于节点数,说明无环 if len(result) == n: return result else: return [] # 存在环,无法拓扑排序示例:4 个任务,边表示依赖关系
edges = [(0, 1), (0, 2), (1, 2), (2, 3)] n = 4 order = topological_sort(edges, n) print("拓扑排序结果:", order) # 输出: [0, 1, 2, 3]
拓扑排序适用于:
注意点:
基本上就这些,掌握建图、入度统计和队列处理就能应对大多数场景。