공통 원소가 없는 부분 집합들로 이루어진 트리 자료구조를 이용하여 union과 find를 사용하는 개념이라고 생각하면 된다.
이름에서 처럼 Union(합치기), Find(찾기) 연산에 유리한 점을 갖고있다.
처음에 아래와 같이 1~8 숫자가 각각 있는 상황이라면, 공통 원소가 없는 [1], [2]...[8] 부분 집합들(트리에서 각 노드)이라고 생각할 수 있다.
이후 아래와 같이 집합(트리)이 구성되는 상황이 있을 수 있다
이 때에도, union과 find를 잘 구현해놓으면 쉽게 루트 노드를 찾을 수 있고, 각 부분 집합들을 잘 합칠 수 있다.
구현은 아래 예시 코드로 보자.
<풀이 코드>
import sys
sys.setrecursionlimit(10**9)
n, m = map(int,sys.stdin.readline().rstrip().split())
# 1. 초기화
parent = [-1 for _ in range(n+1)]
# 2. union기능
def union(a,b) :
a = find(a)
b = find(b)
if a != b :
parent[a] = b
# 3. find 기능
def find(x) :
if parent[x] < 0:
return x
else :
parent[x] = find(parent[x])
return parent[x]
for _ in range(m) :
cmd, a, b = map(int,sys.stdin.readline().rstrip().split())
if cmd == 0:
union(a,b)
else:
if find(a) == find(b) :
print("YES")
else :
print("NO")
참고하기 좋은 곳 :