Python/백준

1717_집합의 표현

728x90

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

 

 

유니온 파인드를 사용하면 어떠한 노드가 그래프에 속해있는지 알 수 있다.

 

 

부모를 찾는 find연산과 유니온 연산으로 나누어져 있다.

 

우선 parents배열을 하나 만들어서 자신의 루트노드를 저장하게 한다. 문제에서 합집합을 만든다는건 결국 두 노드를 이어주어 하나의 그래프로 만든다는 의미이다.

 

그래서 트리구조를 활용해서 가장 부모노드 하나를 잡게한다. 이 노드를 최소값으로 하면 연산량을 더 줄일 수 있다. ( 재귀적으로 호출을 막기 때문 )

 

만약 1-3 이 연결된 상태에서 4를 추가한다면 4의 부모를 3으로 바꿀수도 있지만, 3,4를 모두 1의 자식으로 삼는다면 최종적 부모를 찾기가 더 편할 것이다.

 

 

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)
n,m = map(int,input().split())

parents = [i for i in range(n+1)]
def union(a,b):
    a,b = find(a),find(b)

    if a <= b:
        parents[b] = a
    else:
        parents[a] = b

def find(a):
    if parents[a] ==a:
        return a
    parents[a] = find(parents[a])
    return parents[a]



for _ in range(m):
    order , a , b = map(int,input().split())

    if order:
        print('YES' if find(a)==find(b) else 'NO')
    else:
        union(a, b)
728x90

'Python > 백준' 카테고리의 다른 글

4195_친구네트워크 ...반례?  (0) 2022.05.08
1976_여행가자  (0) 2022.05.08
4803_트리  (0) 2022.05.07
5639_이진검색트리  (0) 2022.05.06
2263_트리의 순회 (메모리초과 나온다면?)  (0) 2022.05.05