Suhwanc

 

위상 정렬은 사이클이 없는 단방향 그래프에서 그래프의 간선 u, v 가 있을 때,

정점의 순서를 찾는 알고리즘입니다.

위상 정렬을 구현할 때는 bfs를 사용합니다.

 

예를 들어

 

이런식으로 구성된 그래프가 있다고 합시다.

여기서 중요한건 위상 정렬을 사용하기 위해선 반드시 모든 간선이 한 방향을 향하고 있어야 한다는 점입니다.

이 그래프가 주어졌을 때 가장 먼저 해야하는 일은 각 노드의 차수를 계산해야 합니다. 

 

차수를 계산하는 방법은 일반적인 그래프와 살짝다른데,

일반적으로는 트리의 높이가 그 노드의 차수였다면

여기서는 연결되어있는 부모의 수가 그 노드의 차수가 됩니다.

  • 차수가 0인 노드 : 4, 5, 3
  • 차수가 1인 노드 : 2, 7, 8
  • 차수가 2인 노드 : 6, 1

차수를 기록했으면 이제 부모가 존재하지 않는 노드들을 큐에 넣어줍니다.

  • 큐 : 4 5 3
  • 결과 : none

큐를 만들어줬다면 이제 차례대로 bfs를 사용합니다.

  • 큐 : 5 3 2
  • 결과 : 4

이 때 가장 중요한건 주황색으로 칠해진 부분의 차수를 -1씩 해주면서 차수를 줄여나가야 합니다.

6은 아직 5가 pop되지 않았기 때문에 큐에 넣지 않습니다.

  • 큐 : 3 2 6
  • 결과 : 4

 

  • 큐 : 2 6
  • 결과 : 4 5 3
  • 1은 아직 6이 나오지 않았기 때문에 큐에 넣지 않습니다.

 

  • 큐 : 6 1
  • 결과 : 4 5 3 2

 

이후 과정을 생략한 결과는 : 4 5 3 2 6 1 8 7 

 

이러한 결과는 차수가 0인 노드들을 큐에 넣는 순서에 따라 달라질 수 있습니다.

 

예시 문제 : 백준 2252번 줄 세우기

https://suhwanc.tistory.com/75

'algorithm class' 카테고리의 다른 글

[C++] emplace 함수  (2) 2020.03.05
LCS 알고리즘  (0) 2020.02.12
유니온 파인드(Disjoint-set) 이란?  (0) 2020.01.06
이진 탐색 트리  (0) 2019.10.21
힙 정렬(Heap sort)  (0) 2019.10.19