문제
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
알고리즘
- 유니온-파인드를 통해 문제를 수행한다.
- 간선들의 가중치를 기준으로 정렬하여 최소 스패닝 트리의 가중치를 구한다.
- 반복문을 통해 두 간선들의 두 정점을 유니온-파인드를 통해 확인한다.
- 두 정점의 부모 노드가 같지 않다면 스패닝 트리인 것이다.
- 부모 노드가 같지 않은 두 정점을 작은 루트 노드를 기준으로 합친다.
코드
import sys
# 최소 스패닝 트리
# 유니온 파인드
# 부모 노드 찾기
def find(a):
if a == parent[a]:
return a
parent[a] = find(parent[a])
return parent[a]
# 트리 합치기
def union(a, b):
a = find(a)
b = find(b)
# 작은 루트 노드를 기준으로 합침
if b < a:
parent[a] = b
else:
parent[b] = a
v, e = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(e)]
graph.sort(key=lambda x: x[2]) # 간선들을 가중치 기준으로 정렬시킨다.
parent = [i for i in range(v+1)]
answer = 0
# 반복문을 통해 간선들의 두 정점을 확인
for s, e, w in graph:
# 부모 노드가 같지 않다면 스패닝 트리!
if find(s) != find(e):
union(s, e) # 두 노드를 합친다.
answer += w
print(answer)
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 14889번(파이썬): 스타트와 링크 (0) | 2022.06.22 |
---|---|
[baekjoon] 백준 14499번(파이썬): 주사위 굴리기 (0) | 2022.06.21 |
[baekjoon] 백준 11404번(파이썬): 플로이드 (0) | 2022.06.19 |
[baekjoon] 백준 2580번(파이썬): 스도쿠 (1) | 2022.06.18 |
[baekjoon] 백준 6593번(파이썬): 상범 빌딩 (0) | 2022.06.17 |