Stable topological sort

前端 未结 6 978
Happy的楠姐
Happy的楠姐 2020-12-29 04:58

Let say I have a graph where the nodes is stored in a sorted list. I now want to topological sort this graph while keeping the original order where the topological order is

6条回答
  •  自闭症患者
    2020-12-29 05:08

    Here's an easy iterative approach to topological sorting: continually remove a node with in-degree 0, along with its edges.

    To achieve a stable version, just modify to: continually remove the smallest-index node with in-degree 0, along with its edges.

    In pseudo-python:

    # N is the number of nodes, labeled 0..N-1
    # edges[i] is a list of nodes j, corresponding to edges (i, j)
    
    inDegree = [0] * N
    for i in range(N):
       for j in edges[i]:
          inDegree[j] += 1
    
    # Now we maintain a "frontier" of in-degree 0 nodes.
    # We take the smallest one until the frontier is exhausted.
    # Note: You could use a priority queue / heap instead of a list,
    #       giving O(NlogN) runtime. This naive implementation is
    #       O(N^2) worst-case (when the order is very ambiguous).
    
    frontier = []
    for i in range(N):
        if inDegree[i] == 0:
            frontier.append(i)
    
    order = []
    while frontier:
        i = min(frontier)
        frontier.remove(i)
        for j in edges[i]:
           inDegree[j] -= 1
           if inDegree[j] == 0:
               frontier.append(j)
    
     # Done - order is now a list of the nodes in topological order,
     # with ties broken by original order in the list.
    

提交回复
热议问题