[kotlin] 프림(Prim) 알고리즘에서 사용하는 자료 구조
프림(Prim) 알고리즘은 그래프의 최소 신장 트리를 찾는 알고리즘으로, 그래프에서 간선의 가중치 합이 최소가 되는 트리를 찾습니다. 이 알고리즘을 구현하기 위해 다양한 자료 구조가 사용됩니다.
우선순위 큐
프림 알고리즘에서 가장 중요한 자료 구조는 우선순위 큐입니다. 우선순위 큐는 각 정점의 키 값을 저장하고, 이 중 가장 작은 키 값을 가진 정점을 빠르게 찾을 수 있습니다. 프림 알고리즘에서는 각 정점의 키 값과 현재 트리에 속한 정점들과의 연결 상태를 우선순위 큐에 저장합니다.
import java.util.*
fun prim(graph: Array<IntArray>) {
val n = graph.size
val key = IntArray(n) { Int.MAX_VALUE }
val mstSet = BooleanArray(n)
val parent = IntArray(n)
val pq = PriorityQueue<Pair<Int, Int>>(compareBy { it.first })
key[0] = 0
pq.add(0 to 0)
while (pq.isNotEmpty()) {
val u = pq.poll().second
mstSet[u] = true
for (v in graph.indices) {
if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {
key[v] = graph[u][v]
parent[v] = u
pq.add(key[v] to v)
}
}
}
// 최소 신장 트리 출력
for (i in 1 until n) {
println("${parent[i]} - $i : ${graph[i][parent[i]]}")
}
}
위 코드에서 pq
는 우선순위 큐로, 각 정점의 키 값과 정점 번호의 쌍을 저장합니다. 또한 key
배열은 현재 트리와 연결된 간선의 가중치를 저장합니다.
결론
프림 알고리즘은 우선순위 큐와 배열을 이용해 간단하게 구현할 수 있습니다.
프림 알고리즘에 대한 자세한 내용은 “Introduction to Algorithms” 책을 참고하시기 바랍니다.