상상쓰

[백준] 집합의 표현 본문

Coding Test

[백준] 집합의 표현

상상쓰 2021. 10. 18. 18:30

https://www.acmicpc.net/problem/1717

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

 

union-find 알고리즘을 사용하여 분리 집합을 표현하였다.

예를 들어, {1, 2, 3}, {4, 5} 인 집합에서 '0 3 5' 의 입력을 받으면 root[1] = 5, root[2] = 5, root[3] = 5, root[4] = 5, root[5] = 5로 하여 root[i] = 5가 나오는 i는 같은 집합의 원소라고 할 수 있다. 5가 아닌 3이라고 정해도 상관없다.

 

import sys

sys.setrecursionlimit(10**6)

n, m = map(int, sys.stdin.readline().split())
root = [i for i in range(n + 1)]

def union(a, b):
    a = find(a)
    b = find(b)
    root[a] = b

def find(a):
    if root[a] == a:
        return a
    else:
        root[a] = find(root[a])
        return root[a]

for i in range(m):
    o, a, b = map(int, sys.stdin.readline().split())
    
    if o == 0:
        union(a, b)
    else:
        if find(a) == find(b):
            print('YES')
        else:
            print('NO')
Comments