본문 바로가기
알고리즘

[Swift] 크루스칼 알고리즘 코드

by 고고 2022. 2. 7.
import Foundation

// 특정 원소가 속한 집합을 찾기
func findParent(parent: inout [Int], x: Int) -> Int {
    // 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
    if parent[x] != x {
        parent[x] = findParent(parent: &parent, x: parent[x])
    }
    return parent[x]
}
// 두 원소가 속한 집합을 합치기
func union(parent: inout [Int], a: Int, b: Int) {
    let a = findParent(parent: &parent, x: a)
    let b = findParent(parent: &parent, x: b)
    if a < b {
        parent[b] = a
    } else {
        parent[a] = b
    }
}

let v = 7
let e = 9
// 부모 테이블 초기화하기
var parent = Array(repeating: 0, count: v + 1)

// 부모 테이블상에서, 부모를 자기 자신으로 초기화
for i in 1...v {
    parent[i] = i
}

// Union 연산을 각각 수행
var edges = [[1, 2, 29], [1, 5, 75], [2, 3, 35], [2, 6, 34], [3, 4, 7], [4, 6, 23], [4, 7, 13], [5, 6, 53], [6, 7, 25]]

var result = 0

// 간선을 비용순으로 정렬
edges.sort(by: { $0.last! < $1.last! })

// 간선을 하나씩 확인하며
for edge in edges {
    let a = edge[0]
    let b = edge[1]
    let cost = edge[2]
    // 사이클이 발생하지 않는 경우에만 집합에 포함
    if findParent(parent: &parent, x: a) != findParent(parent: &parent, x: b) {
        union(parent: &parent, a: a, b: b)
        result += cost
    }
}

print(result)

'알고리즘' 카테고리의 다른 글

[Swift] 백준 - 어른 상어 코드  (0) 2022.02.08
[Swift] union-find 코드  (0) 2022.02.07
[Swift] 다익스트라 - 최소 힙 코드  (0) 2022.02.07
[Swift] 힙 코드  (0) 2022.02.07
[Swift] 백준 - 플로이드  (0) 2022.02.07

댓글