상호배타집합을 표현하는 방법
상호배타집합 연산
Make-Set(x): 유일한 멤버 x를 포함하는 새로우 ㄴ집합을 생성하는 연산
def Make_Set(x):
p[x] = x # 나 자신을 가리킴
Find_Set(x): x를 포함하는 집합을 찾는 연산
def Find_Set(x)
if x == p[x]: return x
else:
return Find_Set(p[x])
# 반복구조
def Find_set(x):
while x != p[x]:
x = p[x]
return x
Union(x, y): x와 y를 포함하는 두 집합을 통합하는 연산
def Union(x, y):
p[Find_Set(y)] = Find_Set(x)
연산의 효율을 높이는 방법
백준 1717 집합의 표현
https://www.acmicpc.net/problem/1717
코드
# BOJ 1717 집합의 표현 - 유니온파인드 골드 4 김수만
# x를 포함하는 집합 찾기
def find_set(x):
while x != P[x]:
x = P[x]
return x
# x와 y 포함하는 두 집합 통합
def union(x, y):
root_x, root_y = find_set(x), find_set(y)
P[max(root_x, root_y)] = min(root_y, root_x)
N, M = map(int, input().split())
P = [0] * (N + 1)
# 처음엔 자기 자신 가리키게
for i in range(N + 1):
P[i] = i
for i in range(M):
cal, a, b = map(int, input().split())
# a와 b가 같은 경우는 연산 패스해야 시간초과 안남
if cal == 0:
if a != b:
union(a, b)
else:
if a == b:
print("YES")
elif find_set(a) == find_set(b):
print("YES")
else:
print("NO")