반응형
백준 1717번 집합의 표현
파이썬 풀이
union-find 알고리즘을 사용하여 풀었습니다.
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N, M = map(int,input().split())
parent = [0] * (N+1) # 부모 테이블 생성
for i in range(N+1): # 자기 자신을 부모로 설정
parent[i] = i
# 루트 노드 찾는 함수
def find(a):
if a == parent[a]: # 자기 자신이 루트 노드이면 a 반환
return a
p = find(parent[a]) # a의 루트 노드 찾기
parent[a] = p # 부모 테이블 갱신
return parent[a] # a의 루트 노드 반환
# a가 속해있는 집합과 b가 속해있는 집합을 합치는 연산
def union(a,b):
a = find(a) # a의 루트 노드 찾기
b = find(b) # b의 루트 노드 찾기
if a == b: # a와 b의 루트 노드가 같으면 동일한 집합
return
if a < b: # a와 b의 루트 노드가 다르면 두 집합을 합치기
parent[b] = a
else:
parent[a] = b
for _ in range(M):
o, a, b = map(int,input().split()) # operation, 원소, 원소
if o == 0: # o=0은 두 원소가 포함되어 있는 집합을 합치기
union(a,b)
elif o == 1: # 두 원소가 동일한 집합인지 판단
if find(a) == find(b):
print('YES')
else:
print('NO')
반응형
'Python > 백준' 카테고리의 다른 글
[백준 파이썬] 1647번 도시 분할 계획 (0) | 2021.04.24 |
---|---|
[백준 파이썬] 1922번 네트워크 연결 (1) | 2021.04.24 |
[백준 파이썬] 1976번 여행가자 (0) | 2021.04.23 |
[백준 파이썬] 11657번 타임머신 (0) | 2021.04.22 |
[백준 파이썬] 1753번 최단경로 (0) | 2021.04.21 |