위상 정렬 알고리즘
순서가 정해져 있는 작업을 차례로 수행해야 할 때, 순서를 결정해주는 알고리즘
알고리즘 단계
- 진입 차수가 0인 정점을 큐에 넣는다.
- 큐에서 원소를 꺼내 해당 원소와 연결된 간선을 제거한다.
- 제거 후 진입 차수가 0이된 정점을 큐에 삽입한다.
- 큐가 빌 때까지 2,3번을 반복한다.
특징
- 모든 원소를 방문하기 전에 큐가 빈다면 싸이클이 존재하는 것이다.
- 모든 원소를 방문했다면 큐에서 꺼낸 순서가 위상 정렬의 결과이다.
동작
- 데이터 초기화
- 알고리즘 단계 수행
val nodes = mutableMapOf<Int, MutableList<Int>>()
val inDegree = MutableList(n+1){0}
val heap = PriorityQueue<Int>()
(1 .. n).forEach {
nodes[it] = mutableListOf()
}
(0 until m).forEach {
val (a,b) = readLine().split(" ").map { it.toInt() }
nodes[a]?.add(b)
inDegree[b]+=1
}
for( i in 1 until inDegree.size){
if(inDegree[i] ==0) heap.add(i)
}
val result = mutableListOf<Int>()
while (heap.isNotEmpty()){
val pop = heap.poll()
result.add(pop)
nodes[pop]?.forEach {
inDegree[it] -=1
if(inDegree[it] ==0){
heap.add(it)
}
}
}