# 크루스칼 알고리즘 (Kruskal's algorithm)
# 1) 모든 정점은 독립적인 집합으로 만듬
# 2) 모든 간선을 최소 가중치 기준으로 정렬하고, 비용이 작은 간선 부터 양끝의 두 정점을 비교한다.
# 3) 두 정점의 최상위 정점을 확인하고 서로 다를 경우 두 정점 연결(최소신장트리는 사이클이 없으므로) 
# 4) 탐욕알고리즘을 기초로 함(하나 하나 실행하면서 최적의 결과값 도출)

# Union-Find 알고리즘
# Disjoint Set:서로 중복되지 않는 부분집합들로 나눠진 상호 배타적인 부분집합 = 서로소 집합
# Disjoint Set을 표현할 때 사용되는 알고리즘(트리구조 활용할 때)
# 같은 집합안의 노드끼리 사이클이 생성될 수 있는 것을 막음
# 노드들 중 연결된 노드를 찾거나, 노드들을 서로 연결(합칠 떄)할 때
# 순서
# 1) 초기화 :  n 개의 원소로 1개씩 개별 집합으로 이뤄지도록 초기화
# 2) Union : 개별적인 집합을 하나의 집합으로, 두 트리를 하나의 트리로 합치는 과정
# 3) Find :  여러노드 존재할 때  두 개의 노드를 선택해서, 현재 두 노드가 서로 같은 그래프에 속하는지
#            판별하기 위해, 각 그룹의 최상단 원소 (즉, 루트 노드)를 비교 확인
            # 루트노드가 다르면 다른 집합인 것을 알게된다.