BOJ 1197 최소 스패닝 트리
✅ 나동빈 책을 보고 나서 풀어보려고 했는데, 생각보다 잘 안풀린다.
요즘 자주 참고하는 블로그가 있는데,
이번 코드도 여기서 참고 했다.
✅ 코드
let firstLine = readLine()!.split(separator: " ").map({Int($0)!})
let v = firstLine[0] // 정점의 개수
let e = firstLine[1] // 간선의 개수
var parent = Array(0...v)
var graph: [[Int]] = []
var result = 0
// 루트 노드를 찾는 함수
func findParent(_ index: Int) -> Int {
if parent[index] == index { return index } // 부모의 인덱스가 나와 같으면 그대로 반환
else { // 부모의 인덱스가 나와 다르면 루트노드가 있다는 의미이므로 재귀적으로 다시 찾기
parent[index] = findParent(parent[index])
return parent[index] // 결국 최종적으로는 루트 노드의 index를 반환한다!
}
}
// 루트 노드를 합치는 함수
func unionParent(_ a: Int, _ b: Int) {
let num1 = findParent(a)
let num2 = findParent(b)
if a < b { parent[num2] = num1 } // 더 인덱스가 작은 루트 노드를 갖게끔 병합
else { parent[num1] = num2 }
}
// 2차원 배열로 세팅함.
for _ in 0..<e {
graph.append(readLine()!.split(separator: " ").map { Int($0)! })
}
graph.sort { $0[2] < $1[2] }
for index in 0..<graph.count {
// 시작노드와 끝노드를 넣어서 사이클이 만들어지는지 확인.
if findParent(graph[index][0]) != findParent(graph[index][1]) { // 사이클이 만들어지지 않는 경우에만
result += graph[index][2] // 비용 증가
unionParent(graph[index][0], graph[index][1]) }
}
print(result)
'알고리즘 문제 풀이' 카테고리의 다른 글
[Swift] BOJ 1197 네트워크 연결 (🎉 400번째 포스팅이다 ㅎㅎ) (0) | 2022.05.17 |
---|---|
[Swift] BOJ 1647 도시 분할 계획 (0) | 2022.05.16 |
[Swift] BOJ 2143 두 배열의 합 (0) | 2022.05.13 |
[Swift] BOJ 2352 반도체 설계 (0) | 2022.05.12 |
[Swift] BOJ 2805 나무 자르기 (0) | 2022.05.12 |