문제 링크
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])
'Baekjoon > 유니온 파인드' 카테고리의 다른 글
[백준] 4195번, 친구 네트워크 | (python,파이썬) (0) | 2021.08.04 |
---|---|
[백준] 1976번, 여행 가자 | (python,파이썬) (0) | 2021.07.28 |