알고리즘/그래프

위상정렬

산타 브라운 2018. 9. 1. 16:27

2252 줄 세우기 : https://www.acmicpc.net/problem/2252


위상정렬

: DAG(비 순환 방향 그래프)에서 그래프의 방향성을 거스르지 않고 정점들을 나열하는 것

- 각 정점을 우선순위에 따라 배치함

- 일반적으로 위상정렬의 결과는 유일하지 않음

- 위상정렬 수행 과정

1) 자기 자신을 가리키는 간선이 없는 정점을 찾음(in-degree == 0)

2) 찾은 정점을 출력하고, 출력한 정점과 그 정점에서 출발하는 간선을 삭제

3) 아직 그래프에 정점이 남아있으면 단계 1로 돌아가고, 아니면 알고리즘을 종료


    //초기 degree 값이 0인 것 큐에 넣음

    for(int i=1; i<=n; i++){

        if(degree[i] == 0){

            q.push(i);

        }

    }

    

    // 위상정렬 시작

    while(!q.empty()){

        int node = q.front(); q.pop();

        printf("%d ", node);

        for(int i=0; i<adj[node].size(); i++){

            int nnode = adj[node][i];

            degree[nnode]--;

            if(degree[nnode] == 0) q.push(nnode);

        }

    }