분리집합이란 교집합이 존재하지 않는 두개 이상의 집합을 관리하는 자료구조이다. 서로소 집합, Union - Find라고도 부른다.
주어진 원소(start point)의 부모 node를 반복적으로 탐색하여, 최종적으로 root node를 return한다.
parent = [i for i in range(N + 1)] # 리스트에 저장되는 값이 부모node
def find_parent(sp): # 부모를 찾아 반복하는 함수라는 의미
if sp != parent[sp]: # 자식과 부모가 다르면
parent[sp] = find_parent(parent[sp])
# sp 노드의 부모값을 찾고 그 값의 부모를, 또 그 값의 부모를 찾아가는 과정
return parent[sp]
교집합이 존재하지 않는 두 개의 집합을 합치는 연산이다. 각 집합의 root node를 찾아서, A집합의 root node를 B집합의 root node의 부모로 설정하여 두 집합의 root node를 동일하게 해준다. 즉 두 집합은 하나의 집합이 된다.
def union(sp,ep):
rep[find_set(sp)] = find_set(ep)
import sys
sys.setrecursionlimit(10**7)
input = sys.stdin.readline
def find_parent(sp):
if sp != parent[sp]:
parent[sp] = find_parent(parent[sp])
return parent[sp]
def union(sp,ep):
parent[find_parent(sp)] = find_parent(ep)
N, M = map(int,input().split())
parent = [i for i in range(N + 1)]
for _ in range(M):
flag, sp, ep = map(int,input().split())
if flag :
if find_parent(sp) == find_parent(ep) :
print("YES")
else :
print("NO")
else : union(sp, ep)