반응형
https://www.acmicpc.net/problem/1717
혼자 힘으로 풀었는가? X
알고리즘 분류
- 자료 구조
- 분리 집합
문제
초기에 개의 집합 이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 , 이 주어진다. 은 입력으로 주어지는 연산의 개수이다. 다음 개의 줄에는 각각의 연산이 주어진다. 합집합은 의 형태로 입력이 주어진다. 이는 가 포함되어 있는 집합과, 가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 의 형태로 입력이 주어진다. 이는 와 가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
출력
1로 시작하는 입력에 대해서 와 가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
제한
- 는 정수 ,
- 는 같을 수도 있다. 와
2023.09.05 - [Language/Python] - 분리 집합 (Disjoint Set) : Union-Find 알고리즘
위의 알고리즘을 사용한다.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
n, m = map(int, input().split())
parent = [i for i in range(n+1)]
#주어진 집합의 루트를 찾음
def find(x):
if parent[x] == x: #주어진 값이 루트면 리턴
return x
parent[x] = find(parent[x]) #아니면 부모를 찾아 재귀
return parent[x]
#두 개의 집합이 같은 집합인지 확인, 아닐경우 하나로 합침
def union(x, y):
x = find(x)
y = find(y) #주어진 x, y의 루트를 찾아서
if x == y: #루트가 같다면 동일한 집합
return
parent[x] = y #아니라면 같은 집합으로 합쳐주기
#x의 부모는 y
return
for _ in range(m):
flag, a, b = map(int, input().split())
if flag == 0:
union(a, b)
else:
x = find(a)
y = find(b)
if x == y:
print("YES")
else:
print("NO")
parent 배열의 루트를 초기값을 자기자신으로 할당한다.
parent = [i for i in range(n+1)]
이후 1이 입력될 때 a와 b의 루트를 찾아서 동일한 루트(같은 집합)이면 YES, 아니면 NO를 출력한다.
x = find(a)
y = find(b)
if x == y:
print("YES")
else:
print("NO")
반응형
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 18110번 - solced.ac (실버 4) (0) | 2023.09.07 |
---|---|
[Python] 백준 1916번 - 최소비용 구하기 (골드 5) (0) | 2023.09.06 |
[Python] 백준 2293번 - 동전 1 (골드 5) (0) | 2023.08.31 |
[Python] 백준 14503번 - 로봇 청소기 (골드 5) (0) | 2023.08.28 |
[Python] 백준 1759번 - 암호 만들기 (골드 5) (0) | 2023.08.23 |
댓글