백준
백준 1717 집합의 표현 (파이썬)
chldkato
2020. 2. 27. 20:58
https://www.acmicpc.net/problem/1717
1717번: 집합의 표현
첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a
www.acmicpc.net
1. 집합 n+1개를 만들고 자기자신을 부모로 설정한다
2. z가 0이면 앞의 숫자를 부모로 하는 disjoint-set 실행
3. z가 1이면 각자의 부모를 찾아 일치하면 YES 아니면 NO 출력
import sys
input = sys.stdin.readline
def get_parent(x):
if parent[x] == x:
return x
p = get_parent(parent[x])
parent[x] = p
return p
def union(x, y):
x = get_parent(x)
y = get_parent(y)
if x != y:
parent[y] = x
def find_parent(x):
if parent[x] == x:
return x
return find_parent(parent[x])
n, m = map(int, input().split())
parent = {}
for i in range(n+1):
parent[i] = i
for _ in range(m):
z, x, y = map(int, input().split())
if not z:
union(x, y)
if z:
if find_parent(x) == find_parent(y):
print('YES')
else:
print('NO')