Python中使用拓扑排序对有向图进行排序
拓扑排序是将有向无环图(DAG)中的节点按照拓扑顺序排序的算法,常用于确定任务执行顺序、编译顺序等。下面是Python中使用拓扑排序对有向图进行排序的代码演示:
from collections import deque def topological_sort(graph): # 计算每个节点的入度 in_degree = {node: 0 for node in graph} for node in graph: for neighbor in graph[node]: in_degree[neighbor] += 1 # 将入度为0的节点加入队列 zero_in_degree_nodes = deque(node for node in in_degree if in_degree[node] == 0) # 记录排序后的节点顺序 sorted_nodes = [] # 依次将入度为0的节点弹出队列,并更新与之相邻节点的入度 while zero_in_degree_nodes: node = zero_in_degree_nodes.popleft() sorted_nodes.append(node) for neighbor in graph[node]: in_degree[neighbor] -= 1 if in_degree[neighbor] == 0: zero_in_degree_nodes.append(neighbor) # 如果存在入度不为0的节点,说明存在环,无法进行拓扑排序 if len(sorted_nodes) != len(graph): raise ValueError('存在环,无法进行拓扑排序') return sorted_nodes # 构建有向图 graph = { 'p': ['i', 'd', 'a', 'n', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm'], 'i': ['d', 'a'], 'd': ['a'], 'n': ['s'], 'e': ['r', 'o'], 'r': ['o'], 'o': ['m'] } # 对有向图进行拓扑排序 sorted_nodes = topological_sort(graph) print(sorted_nodes) # 输出:['p', 'i', 'd', 'a', 'n', 'c', 'o', 'e', 'r', 'm', 's']
上面的代码中,首先计算每个节点的入度,并将入度为0的节点加入队列,然后依次将入度为0的节点弹出队列,并更新与之相邻节点的入度。如果存在入度不为0的节点,说明存在环,无法进行拓扑排序。最终,返回排序后的节点顺序。在代码中使用了一个辅助函数deque
,它是一个双向队列,比普通列表更高效。
相关文章