https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
풀이
사이클이 생기는지에 대해서 확인해보는 문제.
- BFS는 간선을 추가한 그래프를 처음부터 계속 탐색해야하기에 부담이 크다.
- 분리 집합을 사용해서 사이클이 생기는지 확인하도록 했다.
분리집합 알고리즘
https://sunghyun98.tistory.com/256
[알고리즘] 분리 집합
분리 집합(Disjoint Set, Union-Find)은 많은 알고리즘 코딩 테스트에서 중요한 자료구조로 나타납니다. 분리 집합은 여러 노드가 서로 중복되지 않는 집합으로 나뉘어 있을 때, 각 집합을 대표하는 노
sunghyun98.tistory.com
코드
# 20040번 사이클 게임
# 사이클이 생기는지에 대한 확인을 위해 분리집합을 사용할 것이다. bfs는 시간소모가 너무크다.
import sys
def find_parent(x):
if x != parent[x]:
parent[x] = find_parent(parent[x])
return parent[x]
def union(a, b):
a = find_parent(a)
b = find_parent(b)
if a < b:
parent[b] = a
else:
parent[a] = b
n, m = map(int, sys.stdin.readline().split())
parent = [i for i in range(n)]
ans = 0
for i in range(m):
x, y = map(int, sys.stdin.readline().split())
# 부모가 같다면 사이클 구성한다.
if find_parent(x) != find_parent(y):
union(x, y)
else:
ans = i + 1
break
print(ans)
출력결과
'백준 > 분리 집합' 카테고리의 다른 글
[백준][Python] 7511번 소셜 네트워킹 어플리케이션 - 코팩 (0) | 2023.08.31 |
---|