본문 바로가기

알고리즘 문제 풀이/Baekjoon

1717 - 집합의 표현

반응형
SMALL

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

이 전에 풀었던 1976 - 여행 가자 문제와 유사한 문제입니다.

 

단, 이 문제는 중간 중간마다 결과를 출력해야 한다는 점만 분기를 주면 되는 문제입니다.

 

이 문제도 Union-Find 알고리즘을 사용하면 쉽게 풀 수 있는 문제입니다.

 

import sys

sys.setrecursionlimit(10**9)

def find(u):
    if u == parent[u]:
        return u
    else:
        parent[u] = find(parent[u])
        return parent[u]

def union(u, v):
    u = find(u)
    v = find(v)

    if u == v:
        pass
    else:
        if u < v:
            parent[v] = u
        else:
            parent[u] = v

N, M = list(map(int,input().split()))

parent = [i for i in range(N + 1)]

for _ in range(M):
    a, u, v = list(map(int,input().split()))
    if a == 0:
        union(u, v)
    else:
        c1 = find(u)
        c2 = find(v)
        if c1 == c2:
            print("YES")
        else:
            print("NO")

이상 1717 - 집합의 표현 였습니다. ^_^

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

5052 - 전화번호 목록  (0) 2020.02.04
1920 - 수 찾기  (0) 2020.01.29
1976 - 여행 가자  (0) 2019.11.17
2110 - 공유기 설치  (0) 2019.11.03
17141 - 게리맨더링  (0) 2019.09.20