[위상정렬]

폭풍저그머성찡 ㅣ 2019. 12. 17. 14:09

위상 정렬이란::

사이클이 존재하지 않는 방향 그래프에서 간선의 방향을 거스르지 않는 순서로 정점들을 정렬하는 알고리즘을 의미한다.

 

 

구현::

그래프 데이터를 입력 받을 때 각 정점에 대한 진입간선의 수를 별도로 저장해 놓는다.

 

루프를 돌며 

ㄱ. 현재 진입 간선의 수가 0개인 정점을 찾는다.

ㄴ. 해당 정점에 연결된 정점들의 진입 간선 수를 1 내리고 해당 정점을 방문 불가 상태로 바꾼다.

 

위의 과정을 반복하며 정점을 방문 순서대로 찍으면 위상 정렬이 완료된다.

 

for(i=1;i<=e;i++) {
    cin >> s;
    cin >> e;
    arr[s][++arr[s][0]] = e;
    enterdg[e]++; 진입간선 카운트
}

for(i=1;i<=v;i++) {
    for(j=1;j<=v;j++) {
        if(enterdg[j] == 0) {
            mp = j;
            enterdg[j] = -1; 진입간선이 0인 정점찾기, -1은 방문 불가상태로 만들기
            break;
        }
    }
    cout << mp;
    for(j=1;j<=arr[mp][0];j++) {
        enterdg[arr[mp][j]]--; 해당 정점에 연결되어있는 정점들 진입간선 -1
    }
}

        
    

 

 

'Algorithm > Algorithm 이론' 카테고리의 다른 글

동적계획법 PS 팁  (0) 2020.05.30
동적 계획법::메모이제이션  (0) 2020.05.28
[Spanning Tree]  (0) 2019.12.13
[기타] 라인 스윕  (0) 2019.12.05
[Dijkstra] 거리간 최단거리  (0) 2019.11.26