[BOJ] 1717 집합의 표현

유니온 파인드


해당 문제는 유니온 파인드(서로소 집합)의 대표적인 유형이다. find연산과 union연산은 아래와 같이 구현하여 풀 수 있다. 초기 시작은 여러 방법이 있는데 -1로 초기화 하는 방법도 있고 자기 자신을 부모로 놓고 푸는 방법이 있다.

아래 코드는 자기 자신을 부모로 구현한 방식이다. 재귀함수를 구현할 때, 재귀가 깊어질 수 있기 때문에 sys 모듈의 setrecursionlimit을 이용하자.

import sys

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

def solution(n, m):
    parent = [0] * (n + 1)
    for i in range(n + 1):
        parent[i] = i
    for _ in range(m):
        cmd, a, b = map(int, sys.stdin.readline().rstrip().split())
        if cmd == 0:
            union_parent(parent, a, b)
        else:
            if find_parent(parent, a) == find_parent(parent, b):
                print("yes")
            else:
                print("no")

if __name__ == "__main__":
    sys.setrecursionlimit(100000)
    N, M = map(int, sys.stdin.readline().rstrip().split())
    solution(N, M)

태그:

카테고리:

업데이트: