728x90
📌 문제
https://www.acmicpc.net/problem/1197
📌 문제 접근 방법
- 크루스칼 알고리즘을 사용해서 구현하였다.
- 가중치를 기준으로 오름차순 정렬한 후,
정렬된 순서대로 간선을 선택하여 사이클이 만들어지지 않는다면 (간선에 연결된 노드 2개가 같은 집합이 아니라면) 노드를 연결하고 가중치를 total에 더해준다.
📌 코드
# 백준 1197 최소 스패닝 트리
def find_set(x):
if x != parents[x]:
parents[x] = find_set(parents[x])
return parents[x]
def union(x, y):
root_x = find_set(x)
root_y = find_set(y)
if rank[root_x] >= rank[root_y]:
parents[root_y] = root_x
if rank[root_x] == rank[root_y]:
rank[root_x] += 1
else:
parents[root_x] = root_y
def kruskal():
total = 0
for a, b, w in edges:
if find_set(a) != find_set(b):
total += w
union(a, b)
return total
V, E = map(int, input().split())
edges = [list(map(int, input().split())) for _ in range(E)]
edges.sort(key=lambda x: x[2])
parents = [x for x in range(V+1)]
rank = [0 for _ in range(V+1)]
print(kruskal())
728x90
'ALGORITHM > BAEKJOON' 카테고리의 다른 글
[BOJ/Python] 20057. 마법사 상어와 토네이도 (0) | 2021.10.28 |
---|---|
[BOJ/Python] 4948. 베르트랑 공준 (0) | 2021.10.21 |
[BOJ/Python] 1717. 집합의 표현 (0) | 2021.10.21 |
[BOJ/Python] 17144. 미세먼지 안녕! (0) | 2021.10.20 |
[BOJ/Python] 14981. 톱니바퀴 (0) | 2021.10.14 |
댓글