E
, 정점의 개수 V
를 기준으로, O(ElogV)
의 시간복잡도를 가지고 있다.신장 트리(Spanning Tree)는 그래프 내의 모든 정점을 포함하고, 사이클이 없는 그래프를 말합니다.
n개의 정점(Vertex)가 있다면, 신장 트리의 간선(Edge) 수는 n-1이 됩니다.
최소 신장 트리(Minimum Spanning Tree)는 각 간선이 가지고 있는 가중치의 합이 최소가 되는 신장 트리를 말합니다.
cost
인 가중치를 작은 값 기준으로 정렬parent
리스트union
함수와 find
함수를 통해 Union&Find 구현def solution(n, costs):
answer = 0
parent = [i for i in range(n)] # 부모 노드를 설정하기 위한 리스트
costs.sort(key=lambda x:x[2]) # cost가 작은 값 기준으로 정렬
def find(a): # 루트 노드를 찾는 함수
if parent[a] == a: # 본인이 루트 노드인 경우
return a
parent[a] = find(parent[a])
return parent[a] # 루트노드를 찾아 저장하고 리턴
def union(a, b): # Tree 두개를 합치는 과정
pa, pb = find(a), find(b) # 각 노드의 루트 노드
if pa == pb : # 루트 노드가 같다는 것은 같은 트리
return
elif pa < pb : # 노드값이 더 낮은 트리쪽으로 합침
parent[pb] = pa
else :
parent[pa] = pb
return
for n1, n2, c in costs:
if find(n1) != find(n2): # 루트 노드가 다르면 연결 후 경로 값 추가
union(n1, n2)
answer += c
return answer