📜  拓扑排序 - Python (1)

📅  最后修改于: 2023-12-03 15:10:07.189000             🧑  作者: Mango

拓扑排序 - Python

拓扑排序是一种常见的有向无环图(DAG)排序算法,用于将有向无环图中的节点拓扑排序为线性序列。拓扑排序常常被用于构建代码编译顺序、任务调度等场景中。

思路

拓扑排序的思路很简单,就是通过不断删除入度为0的顶点来实现。每次找到一个入度为0的顶点,将其从图中删除,并将与之相连的顶点的入度-1,直到图为空或不存在入度为0的顶点为止。若完成排序后还有剩余的顶点,则说明图中存在环。

代码实现

下面是一个使用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的顶点加入队列中
    queue = deque([node for node in in_degree if in_degree[node] == 0])
    # 依次遍历队列中的顶点,将其从图中删除并更新入度
    result = []
    while queue:
        node = queue.popleft()
        result.append(node)
        for neighbor in graph[node]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)
    # 检查结果是否合法
    if len(result) != len(graph):
        raise ValueError("The graph contains a cycle")
    return result
示例

假设我们有以下图:

graph = {
    "A": ["B", "C"],
    "B": ["D"],
    "C": ["D"],
    "D": []
}

我们可以使用上述代码对其进行拓扑排序:

topological_sort(graph)  # ["A", "C", "B", "D"]
总结

拓扑排序是一种常见的有向无环图(DAG)排序算法,可以用于构建代码编译顺序、任务调度等场景中。这篇文章简单介绍了拓扑排序的思路,并给出了一个使用Python实现拓扑排序算法的代码示例。