美文网首页
算法学习笔记——拓扑排序

算法学习笔记——拓扑排序

作者: 吵吵人 | 来源:发表于2020-05-23 17:25 被阅读0次

    概念原理

    它是对有向无环图的顶点排成一个线性序列。用顶点表示活动,用弧表示活动间的优先关系的有向图称为AOV网(Activity on Vertex Network)
    应用场景:

    • 表示工程的次序关系
    • 判断一个层级结构的图是否存在循环引用

    需要注意的是拓扑排序的结果并不是唯一的。

    Python实现代码

    collections是一个内置标准包,不需要安装
    当有向图中无环时,也可利用深度优先遍历进行拓扑排序,因为图中无环,则由图中某点出发进行深度优先搜索遍历时,最先退出DFS函数的顶点即是初度为零的顶点,是拓扑有序序列中最后一个顶点。由此,按退出DFS函数的先后记录下来的顶点序列即为逆向的拓扑有序系列。
    在下面的代码展示中,使用的stack.insert(0, v)语句使后进栈的点位于前面的位置,因此输出的就是正向的拓扑有序序列。

    from collections import defaultdict
    
    class Graph:
       def __init__(self, vertices):
           self.graph = defaultdict(list)  # 声明gragh是一个list,那gragh[]就是一个列表数组,实际上就是邻接表
           self.V = vertices
    
       """
       可以通过添加弧,建立邻接表
       """
    
       def addEdge(self, u, v):
           self.graph[u].append(v)  # 如果不使用defaultdict,这里将会出错
    
       def topologicalSortUtil(self, v, visited, stack):
           visited[v] = True
           for i in self.graph[v]:  # 遍历v节点邻接表
               if visited[i] == False:
                   self.topologicalSortUtil(i, visited, stack)
           stack.insert(0, v)
    
       def topologicalSort(self):
           visited = [False] * self.V
           stack = []
           for i in range(self.V):
               if visited[i] == False:
                   self.topologicalSortUtil(i, visited, stack)  # ????
           print(stack)
    
    
    g = Graph(6)
    g.addEdge(5, 2)
    g.addEdge(5, 0)
    g.addEdge(4, 0)
    g.addEdge(4, 1)
    g.addEdge(2, 3)
    g.addEdge(3, 1)
    
    print("拓扑排序结果:")
    g.topologicalSort()
    

    相关文章

      网友评论

          本文标题:算法学习笔记——拓扑排序

          本文链接:https://www.haomeiwen.com/subject/djakahtx.html