Python中使用拓扑排序对有向图进行排序

2023-04-11 00:00:00 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,它是一个双向队列,比普通列表更高效。

相关文章