문제 정보
풀이
위상 정렬
- 그래프 내의 모든 정점(node)를 선형으로 정렬할 때 사용한다
- cycle이 없는 조건일 경우 사용한다
- 모든 간선
(u,v)
의 node u
가 node v
보다 먼저 오도록 정렬하는 알고리즘이다
알고리즘 적용
indegree
배열에 모든 node
들로 들어오는 간선의 개수를 저장한다
indegree
가 0
인 node
를 시작 node
로 지정하고 queue
에 넣어준다
queue
가 비어있을 때까지 하나씩 꺼내서 그 node
가 들어가는 간선의 도착 node
의 indegree
를 1씩 빼준다
- 이 후
indegree
가 0
이 된 node
가 있다면 다시 queue
에 넣어준다
이러한 알고리즘을 통해 간선으로 연결되어 있는 정점들이 순서대로 정렬할 수 있다
전체 코드
import Foundation
let n = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (n[0], n[1])
var arr: [[Int]] = Array(repeating: [], count: N+1)
var inDegree = Array(repeating: 0, count: N+1)
var queue = Array<Int>()
var result = Array<Int>()
for i in 0..<M{
let m = readLine()!.split(separator: " ").map{Int(String($0))!}
let (A, B) = (m[0], m[1])
arr[A].append(B)
inDegree[B] += 1
}
for i in 1...N{
if inDegree[i] == 0{
queue.append(i)
}
}
while !queue.isEmpty{
var current = queue.remove(at: 0)
result.append(current)
for i in arr[current]{
inDegree[i] -= 1
if inDegree[i] == 0{
queue.append(i)
}
}
}
for i in result{
print(i, terminator: " ")
}