動機

topo sort的重點是怎麼從對的點開始加,像是dfs就要特別注意,不像bfs會有in_degree確認,dfs就是走,什麼都不管

DFS

從*終點(沒有到其他node的edge)*開始往後走,最後的結果要reverse,因為是從終點開始放

另外會有個table去放,node是處理完畢還是處理中的狀態

    def topologicalSortUtil(self, v, visited, stack):
        if visited[v] == 1:
          raise 'loop'
        elif visited[v] == 2:
          return
        visited[v] = 1
        for i in self.graph[v]:
            if visited[i] == False:
                self.topologicalSortUtil(i, visited, stack)
        stack.append(v)
        visited[v] = 2
 
    def topologicalSort(self):
        visited = [0]*self.V
        stack = []
 
        for i in range(self.V):
            if visited[i] == 0:
                self.topologicalSortUtil(i, visited, stack)

        print(stack[::-1])  # return list in reverse order

BFS (Kahn’s algorithm)

從*起點(沒有其他node指到他)*開始往前走,因為要看被多少node指到,所以一個table要另外算 之後就是一直找沒有被指到的邊緣node,加到結果

這裡處理loop就是看bfs結束時是不是所有node都有加到結果,因為loop一定會指到,所以不會被bfs當成邊緣node

    def topologicalSort(self):
        in_degree = [0]*(self.V)
         
        for i in self.graph:
            for j in self.graph[i]:
                in_degree[j] += 1
 
        queue = [queue.append(i) for i in range(self.V) if in_degree[i] == 0]
 
        cnt = 0
        top_order = []
        while queue:
            u = queue.pop(0)
            top_order.append(u)

            for i in self.graph[u]:
                in_degree[i] -= 1
                if in_degree[i] == 0:
                    queue.append(i)
 
            cnt += 1
 
        if cnt != self.V:
            print "There exists a cycle in the graph"
        else :
            print top_order