본문 바로가기
Baekjoon/유니온 파인드

[백준] 1717번, 집합의 표현 | (python,파이썬)

by 성재심 2021. 7. 25.

문제 링크

 

 

1717번: 집합의 표현

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

www.acmicpc.net


문제


문제해결하기

 기본적인 Union-Find 문제로, Union-Find를 이해했다면 쉽게 풀 수있는 문제이다.

개념정리 보러가기 ↓

 

 

[개념정리] 유니온 파인드(Union-Find) by "union by rank"| (python, 파이썬)

유니온 파인드(Union-Find) 알고리즘이란 ? ▷유니온 파인드는 그래프 알고리즘 중 하나로 두 노드가 같은 그래프에 속하는지 판별하는 알고리즘이다. → "합집합 판별" 이라고 생각하면 편할 거 같

corin-jaesung.tistory.com

초기에 자신을 가르키는 n+1개의 집합, 즉 n+1개의 노드들을 tree라는 리스트에 담아주었다.


정답코드

import sys
input = sys.stdin.readline

class Node :
    def __init__(self,key):
        self.key = key
        self.parent = self
        self.rank = 0

def make_set(x) :
    return Node(x)

def find(x) :
    while x.parent != x :
        x = x.parent
    return x 

def union(x,y) :
    v,w = find(x),find(y)
    if v.rank > w.rank :
        v,w = w,v
    v.parent = w
    if v.rank == w.rank :
        w.rank +=1

n, m = map(int, input().split())
tree = [make_set(i) for i in range(n+1)]

for i in range(m) :
    a,b,c = map(int, input().split())
    if a :
        if find(tree[b]) == find(tree[c]) : print("YES")
        else : print("NO")
    else :
        union(tree[b],tree[c])