문제 링크
풀이
크루스칼 알고리즘 사용
# 같은 집합에 속하는지 판별
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
# 두 집합 합치기
def union(x, y):
x= find(x)
y = find(y)
if x == y:
return
if x < y:
parent[y] =x
else:
parent[x] = y
v, e = map(int,input().split())
# 부모 노드 저장 테이블
parent = [0] * (v+1)
for i in range(1,v+1):
parent[i] = i
edges = []
# 간선 정보
for _ in range(e):
a, b, c = map(int,input().split())
edges.append((c,a,b))
edges.append((c,b,a))
# 비용 기준으로 정렬
edges.sort()
result = 0
for edge in edges:
cost, a, b = edge
# 같은 집합에 속하지 않으면
if find(a) != find(b):
# 합치기
union(a,b)
# 비용 더하기
result += cost
print(result)
'개발 > algorithm' 카테고리의 다른 글
[백준 1914번] 하노이 탑 - python / 재귀 (0) | 2022.04.29 |
---|---|
[백준 10217번] KCM Travel - python (0) | 2022.04.29 |
[백준 9372번] 상근이의 여행 - python / 크루스칼 알고리즘 (0) | 2022.04.29 |
[백준 2623번] 음악 프로그램 - python / 위상 정렬 (0) | 2022.04.29 |
[백준 2610번] 회의 준비 - python (0) | 2022.04.29 |