
최소 신장 트리를 묻고 있는 문제로, 최소 신장 트리를 구하여 해결하면 된다.
최소 신장 트리는 데이터를 노드가 아닌 에지 중심으로 저장하므로 인접 리스트가 아닌 에지리스트의 형태로 저장한다.
이 리스트는 일반적으로 노드 변수 2개와 가중치 변수로 구성된다.
또한, 사이클 처리를 위한 유니온 파인드 리스트를 인덱스의 값과 동일하게 초기화한다.
에지리스트에 담긴 그래프 데이터를 가중치 기준으로 오름차순 정렬한다.
가중치가 낮은 에지부터 순서대로 선택해 연결을 시도한다.
이때 바로 연결하지 않고, 유니온 파인드 리스트를 이용하여 find연산을 통해
두 노드의 find값이 같지 않은 경우(사이클이 형성되지 않는 경우)에만, 두 노드를 연결한다.
그 후, union연산을 통해 두 노드를 연결한다.
💡 4. `과정 3 반복하기`전체 노드의 개수가 N개이면, 연결한 에지의 개수가 N-1이 될 때까지 과정 3을 반복한다.
💡 5. `총 에지 비용 출력하기`에지의 개수가 N-1이 되면 알고리즘을 종료하고, 완성된 최소 신장 트리의 총 에지 비용을 출력한다.
# 최소 스패닝 트리
import sys
from queue import PriorityQueue
input = sys.stdin.readline
V, E = map(int, input().split())
D = [0] * (V + 1)
for i in range(1, V + 1):
D[i] = i
edgeCnt = 0
total = 0
queue = PriorityQueue()
def find(idx):
if idx == D[idx]:
return idx
else:
D[idx] = find(D[idx])
return D[idx]
for _ in range(E):
s, e, w = map(int, input().split())
queue.put((w, s, e))
while edgeCnt < V - 1:
w, s, e = queue.get()
if find(s) != find(e):
edgeCnt += 1
total += w
D[find(e)] = D[find(s)]
print(total)