위상정렬 (Topological sort) 는 cycle이 없는 방향 그래프(Directed Acyclic Graph,DAG) 에서 정점들을 선형순서(간선의 방향을 거스리지 않도록)로 나열하는 것을 의미하며, 주어진 그래프내에서 여러 개의 위상 정렬 결과가 나올수도 있다.
defdfs(v): visited[v] = True; for i in adj_list[v]: ifnot visited[i]: dfs(i); # 연결된 정점을 모두 방문하면 진출 차수가 0인 것으로 간주 s.append(v); if __name__ == "__main__": adj_list = [[1],[3,4] ,[0,1] , [6] , [5] , [7] ,[7] , [8] , []]; N = len(adj_list); visited = [False] * N; s = []; # 모든 정점에 대해서 방문하지 않았다면 dfs수행 for i inrange(N): ifnot visited[i]: dfs(i); # 진출 차수가 0 인 정점들을 역순으로 출력 print(s[::-1]);
역순으로 수행하였을떄 위상 정렬의 시간 복잡도는 정점의 개수(N)와 간선의 개수(M) 이라고 하였을 떄 O(N+M)의 시간복잡도를 갖는다.