当前位置 博文首页 > Python关于拓扑排序知识点讲解

    Python关于拓扑排序知识点讲解

    作者:runoob 时间:2021-02-14 18:03

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

    通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

    在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting):

    • 每个顶点出现且只出现一次;
    • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

    实例代码

    from collections import defaultdict 
     
    class Graph: 
     def __init__(self,vertices): 
      self.graph = defaultdict(list) 
      self.V = vertices
     
     def addEdge(self,u,v): 
      self.graph[u].append(v) 
     
     def topologicalSortUtil(self,v,visited,stack): 
     
      visited[v] = True
     
      for i in self.graph[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()

    执行以上代码输出结果为:

    拓扑排序结果:

    [5, 4, 2, 3, 1, 0]

    实例扩展:

    def toposort(graph):
     in_degrees = dict((u,0) for u in graph) #初始化所有顶点入度为0
     vertex_num = len(in_degrees)
     for u in graph:
      for v in graph[u]:
       in_degrees[v] += 1  #计算每个顶点的入度
     Q = [u for u in in_degrees if in_degrees[u] == 0] # 筛选入度为0的顶点
     Seq = []
     while Q:
      u = Q.pop()  #默认从最后一个删除
      Seq.append(u)
      for v in graph[u]:
       in_degrees[v] -= 1  #移除其所有指向
       if in_degrees[v] == 0:
        Q.append(v)   #再次筛选入度为0的顶点
     if len(Seq) == vertex_num:  #如果循环结束后存在非0入度的顶点说明图中有环,不存在拓扑排序
      return Seq
     else:
      print("there's a circle.")
    G = {
     'a':'bce',
     'b':'d',
     'c':'d',
     'd':'',
     'e':'cd'
    }
    print(toposort(G))

    输出结果:

    ['a', 'e', 'c', 'b', 'd']

    js
    下一篇:没有了