欢迎访问宙启技术站
智能推送

用Python实现图(Graph)的拓扑排序算法

发布时间:2023-12-18 16:57:12

拓扑排序是一种用于有向无环图(DAG)的排序算法,它对图中的节点进行线性排序,使得在排序中,任意一对节点 u 和 v,如果存在一条从 u 到 v 的边,那么 u 在排序中出现在 v 之前。拓扑排序算法可以应用于依赖关系管理、任务调度等场景。

下面是使用 Python 实现图的拓扑排序算法的代码:

from collections import defaultdict

class Graph:
    def __init__(self, num_vertices):
        self.graph = defaultdict(list)
        self.num_vertices = num_vertices

    def add_edge(self, u, v):
        self.graph[u].append(v)

    def topological_sort_util(self, v, visited, stack):
        visited[v] = True

        for i in self.graph[v]:
            if not visited[i]:
                self.topological_sort_util(i, visited, stack)

        stack.insert(0, v)

    def topological_sort(self):
        visited = [False] * self.num_vertices
        stack = []

        for i in range(self.num_vertices):
            if not visited[i]:
                self.topological_sort_util(i, visited, stack)

        return stack

在以上代码中,我们首先定义了一个 Graph 类,它包含一个 defaultdict 类型的字典 graph 用于存储图的边和节点之间的关系。add_edge 方法用于添加图的边。topological_sort_util 是一个递归函数,用于实现深度优先搜索(DFS)来进行拓扑排序。topological_sort 方法是对图中的所有节点进行深度优先搜索,并最终返回排序结果。

下面是一个使用例子:

g = Graph(6)
g.add_edge(5, 2)
g.add_edge(5, 0)
g.add_edge(4, 0)
g.add_edge(4, 1)
g.add_edge(2, 3)
g.add_edge(3, 1)

print("拓扑排序结果:", g.topological_sort())

以上例子中,我们创建了一个有向图,图中的节点从 0 到 5,add_edge 方法用于添加边。最后我们调用 topological_sort 方法进行拓扑排序,并打印排序结果。

输出结果为:

拓扑排序结果: [5, 4, 2, 3, 1, 0]

这是此图的一个有效的拓扑排序序列。

总结:拓扑排序是一种对有向无环图进行排序的算法,通过深度优先搜索来实现。以上是使用 Python 实现图的拓扑排序算法的代码和使用例子,希望对你理解拓扑排序算法有所帮助。