https://www.acmicpc.net/problem/1647
https://m.blog.naver.com/ndb796/221230994142
크루스칼 알고리즘(최소 신장 트리): 가장 적은 비용으로 모든 노드를 연결할 때 사용하는 알고리즘
import sys
import heapq
input = sys.stdin.readline
## Union_find 알고리즘 -> 사이클 확인해주려고!
def getParent(parent, x):
if parent[x] == x:
return x
else:
parent[x] = getParent(parent, parent[x])
return parent[x]
def unionParent(parent, a, b):
a = getParent(parent, a)
b = getParent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
def findParent(parent, a, b):
a = getParent(parent, a)
b = getParent(parent, b)
if a == b: # 이미 같은 부모에 속해 있다 = 서로 연결돼 있다.
return 1
else:
return 0
N, M = map(int, input().split())
edge = []
for i in range(M):
a, b, c = map(int, input().split())
heapq.heappush(edge, (c, a, b))
cycle_check = [0] * (N+1)
for i in range(1, N+1):
cycle_check[i] = i
edge_lst = []
for _ in range(M):
if len(edge_lst) == N-1:
break
line, node_a, node_b = heapq.heappop(edge)
if not findParent(cycle_check, node_a, node_b):
edge_lst.append(line)
unionParent(cycle_check, node_a, node_b)
else:
continue
edge_lst.pop()
ans = sum(edge_lst)
print(ans)
처음에 모든 간선 정보를 다 보게 코드를 짜서 시간 초과가 나왔다 -> 간선 확인할 때에 edge_lst의 길이를 확인해주는 조건을 넣어 이미 모든 노드를 리스트에 추가해 주었으면 break를 해 최소한의 노드만 확인해 주는 것으로 해결했다.