Topological Sort (위상 정렬)

조건 : 방향이 있고 사이클이 없는 그래프 (Directed Acyclic Graph)

DAG일때, 방향성을 거스르지 않고 나열하는 것.

순서가 있는 작업을 차례로 수행해야할때 순서를 결정해주기 위해 사용하는 알고리즘.

대학 커리큘럼의 선수과목이나 엄무의 일정을 시간 순서대로 배치한것이 그 예이다.

특징


  • 방향이 있는 그래프이어야한다. (directed)

  • 사이클이 없어야 한다. (Acyclic)

Pesudo Code


  • InDegree 이용방법

Topological Sort(G){
    INITIALIZE-InDegree(G.V)
    result ← ∅

    for each indegree[v] == 0
        Q <- v

    for i = 1 to |G.V|
        u = Pop(Q);
        result <- u
        for each v ∈ Adj[u]
            indegree[u] ← indegree[u] - 1
            if (inDegree[u] == 0)
                Q <- u
 }

  • dfs 이용방법

구현 방법


InDegree 이용

  1. 모든 vertex에 대해 InDegree값을 초기화한다.

  2. 진입 차수 (indegree)가 0인 값을 큐에 삽입해준다.

  3. 큐에서 1개 vertex, v를 pop해준다.

  4. v를 stack에 쌓는다. (정렬한 값을 담는 것이 stack)

  5. v에 연결된 vertex들의 indegree값을 1감소 시켜준다.

  6. 진입 차수가 0인 정점들을 큐에 삽입한다.

  7. 3-6번을 Vertex수만큼 반복한다.

  8. 만약에 큐가 비어있다면, 사이클이 존재하는 그래프이다. (큐가 비어있다면 indegree가 0인 값이 없었다는 소리. 즉, 사이클 발생)

dfs 이용

  1. 방문하지 않은 vertex들을 dfs함수 진행.

  2. dfs

    1. 해당 vertex 방문표시

    2. 인접 vertex에 대해 방문하지 않았다면 dfs함수 진행

    3. dfs함수 종료시 stack에 push

시간 복잡도


  • indegree방법은 초기화하는데 O(V), 큐에 삽입, 제거 하는게 O(V)번씩 소요되며, indegree를 1감소 시켜주는게 O(E)번 일어난다. (indegree를 1감소해주는건 edge를 삭제해주는거와 같기 때문) 따라서, O(V+E)의 시간복잡도를 갖는다.

  • dfs방법또한 모든 vertex에 대해 방문했는지 확인하고, 연결된 모든 E를확인후 dfs수행하기때문에 O(V+E)를 갖는다.

구현 코드


아래 코드는 사이클이없는 무작위의 무방향의 그래프이다. 정렬하게 되면 오름차순으로 정렬되게 edge를 생성하는 그래프

소스코드 c++ ( 접기 / 펼치기 )

Last updated