초기에 개의 집합 이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
첫째 줄에 , 이 주어진다.
은 입력으로 주어지는 연산의 개수이다. 다음 개의 줄에는 각각의 연산이 주어진다. 합집합은 의 형태로 입력이 주어진다. 이는 가 포함되어 있는 집합과, 가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 의 형태로 입력이 주어진다. 이는 와 가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
1로 시작하는 입력에 대해서 와 가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
풀이
오늘 공부한 유니온 파인드 알고리즘을 활용해볼 수 있는 정석적인 문제였다
union 함수와 find 함수를 각각 작성한 후에 for 루프를 m번 돌면서 명령에 맞게 union과 find를 호출해준다
명령이 1인 경우에는 a에 대한 find 함수의 결과와 b에 대한 find 함수의 결과를 비교해 답을 출력한다
주의할 점은 재귀함수를 쓸 때는 무조건 sys.setrecursionlimit()을 설정하자
코드
import sys
sys.setrecursionlimit(1000000)
n, m = map(int, sys.stdin.readline().split())
parent = [i for i in range(n+1)]
def find_parent(parent, a):
if parent[a] != a:
parent[a] = find_parent(parent, parent[a])
return parent[a]
def union_node(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
for _ in range(m):
command, a, b = map(int, sys.stdin.readline().split())
if command == 0:
union_node(parent, a, b)
else:
print("yes" if find_parent(parent, a) == find_parent(parent, b) else "no")