유니온 파인드(분리집합)
그래프 알고리즘으로, 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘. 단, 이 때 하나의 그래프는 하나의 집합(set)으로 이해한다.



풀어볼 문제
Last updated
그래프 알고리즘으로, 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘. 단, 이 때 하나의 그래프는 하나의 집합(set)으로 이해한다.



Last updated
parent = [i for i in range(0, n + 1)]def find(target):
if target == parent[target]:
return target
#경로 압축 최적화 - 루트노드로 모두 집합!!
parent[target]=find(parent[target])
return parent[target]def union(a,b):
a = find(a)
b = find(b)
#작은 루트 노드 기준으로 합치라!! 같은 그룹으로 묶기
if a==b: return
if a < b:
parent[b]=a
else:
parent[a]=bimport sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
def find(target):
if target == parent[target]:
return target
#경로 압축 최적화 - 부모노드로 모두 집합!!
parent[target]=find(parent[target])
return parent[target]
def union(a,b):
a = find(a)
b = find(b)
#작은 루트 노드 기준으로 합치라!! 같은 그룹으로 묶기
if a==b: return
if a < b:
parent[b]=a
else:
parent[a]=b
N,M=map(int,input().split())
parent=[i for i in range(N+1)]
for _ in range(M):
x, a, b = map(int,input().split())
if x ==0: union(a,b)
else:
if find(a)==find(b): print('YES')
else: print("NO")#사이클 판단
#union find
import sys
input=sys.stdin.readline
# find 연산
def find(target):
if target == parent[target]:
return target
# 경로 압축 최적화
parent[target] = find(parent[target])
return parent[target]
# union 연산
def union(a, b):
a = find(a)
b = find(b)
# 작은 루트 노드를 기준으로 합침
if a < b:
parent[b] = a
else:
parent[a] = b
N,M=map(int,input().split())
parent = [i for i in range(N)]
for j in range(M):
x,y=map(int,input().split())
if find(x)==find(y):print(j+1); exit()
union(x,y)
print(0)