개발/algorithm
[백준 1717번] 집합의 표현 - python / union-find 알고리즘
zzi_on2
2022. 4. 22. 13:36
문제 링크
풀이
Union-Find 알고리즘
: 어떤 두 원소가 주어졌을 때 같은 집합에 속하는지 판별하는 알고리즘
: 서로소 집합, 상호 배타적 집합 (Disjoint-set)
: union 함수 - 두 집합 합치기
: find 함수 - 두 집합의 부모 구하기
# Union-Find 알고리즘
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def find(a):
if a == parent[a]:
return a
# 루트 노드 찾기
p = find(parent[a])
# 루트 노드 갱신
parent[a] = p
return parent[a]
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 = [0] * (n+1)
# 자기 자신을 설정
for i in range(1,n+1):
parent[i] = i
for _ in range(m):
cal, a, b = map(int,input().split())
# 합치기
if cal == 0:
union(a,b)
else:
# 같은 집합인지 확인하기
if find(a) == find(b):
print('YES')
else:
print("NO")
- 처음에 런타임 에러가 발생하였는데 sys.setrecursionlimit(100000) 추가해줌으로서 해결