Search
Duplicate
♠️

위상정렬

개념
위상 정렬은 비순환 방향 그래프(DAG)에서 정점들을 선형으로 정렬하는 것이다.
모든 간선 (u, v)에 대해 정점 u가 정점 v보다 먼저 오는 순서로 정렬된다.
그래프가 비순환 방향 그래프가 아닌 경우, 그래프에 대한 위상 정렬은 불가능하다.
그래프에 사이클이 존재하면서 두 정점 u, v가 사이클에 속한 정점일 경우, 정점 uv보다 먼저 오거나 vu보다 먼저 올 수 있기 때문이다.
구현에서 모든 원소를 방문하기 전에 큐가 비게 된다면 사이클이 존재한다고 판단할 수 있다.
사이클에 포함된 원소 중에서 해당되는 어떠한 원소도 큐에 들어가지 못하게 되기 때문이다.
하나의 DAG에서 하나 이상의 위상 순서가 나올 수 있으며 모든 간선은 오른쪽 방향만 가리키게 된다.
구현
1.
모든 정점의 진입차수를 설정한다.
2.
진입차수가 0인 정점을 방문한 것으로 표시하고 큐에 정점을 추가한다.
3.
큐가 비어있게 될 때까지 순회하며 다음 작업을 수행한다.
a.
큐에서 값을 꺼내 해당 노드에서 나가는 방향을 그래프에서 제거한다.
해당 간선의 도착 노드의 진입차수가 1씩 감소한다
b.
진입차수가 0인 노드를 큐에 삽입한다.