728x90
📌 문제
https://swexpertacademy.com/main/main.do
📌 문제 접근 방법
- 크루스칼 알고리즘을 사용해서 풀었다.
- 간선을 가중치를 기준으로 내림차순 정렬을 해준다.
- 노드1, 노드2의 조상 노드가 다르다면 사이클이 만들어지지 않으므로 연결해준다.
- 3번의 과정을 반복하며 가중치를 더해서 출력해준다.
📌 코드
import sys
sys.stdin = open('input.txt')
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)
# root_x의 트리의 높이(rank)가 더 클 경우
if ranks[root_x] >= ranks[root_y]:
parents[root_y] = root_x
# 만약에 높이가 같다면 rank 증가
if ranks[root_x] == ranks[root_y]:
ranks[root_y] += 1
# root_y의 트리의 높이가 더 크거나 같을 경우
else:
parents[root_x] = root_y
def mst(edges):
total = 0
mst_list = []
for n1, n2, w in edges:
if find_set(n1) != find_set(n2):
mst_list.append((n1, n2, w))
union(n1, n2)
total += w
return total
T = int(input())
for t in range(1, T+1):
V, E = map(int, input().split())
edges = [list(map(int, input().split())) for _ in range(E)]
parents = [x for x in range(V+1)]
ranks = [0 for _ in range(V+1)]
edges.sort(key=lambda x: x[2])
print('#{} {}'.format(t, mst(edges)))
728x90
'ALGORITHM > SW Expert Academy' 카테고리의 다른 글
[SWEA/Python] 5251. 최소 이동 거리 (0) | 2021.10.15 |
---|---|
[SWEA/Python] 5250. 최소 비용 (0) | 2021.10.15 |
[SWEA/Python] 5248. 그룹 나누기 (0) | 2021.10.14 |
[SWEA/Python] 5247. 연산 (0) | 2021.10.14 |
[SWEA/Python] 2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2021.10.12 |
댓글