https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
Union-Find 기초문제이다.
두 점을 선분으로 잇기 전에, 이 두 점이 다른 경로로 이미 연결되어있다면 사이클을 형성할 것이다.
다른 경로로 이미 연결되어있는지에 대한 여부는 Union-FInd를 이용하면 된다.
0. 입력이 들어온다.
1. 두 점의 그룹이 같은지 확인한다.
2-1. 같다면 답을 출력하고 바로 종료한다.
2-2. 다르다면 두 점의 그룹을 하나로 합쳐준다.
3. 주어진 모든 간선이 멀쩡히 잘 이어졌다면, 0을 출력한다
Pypy3에서는 메모리 초과가 뜬다. 재귀 제한때문에 그런듯
템플릿 코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import sys, math
import heapq
from collections import deque
input = sys.stdin.readline
hqp = heapq.heappop
hqs = heapq.heappush
#input
def ip(): return int(input())
def sp(): return str(input().rstrip())
def mip(): return map(int, input().split())
def msp(): return map(str, input().split().rstrip())
def lmip(): return list(map(int, input().split()))
def lmsp(): return list(map(str, input().split().rstrip()))
#gcd, lcm
def gcd(x, y):
while y:
x, y = y, x % y
return x
def lcm(x, y):
return x * y // gcd(x, y)
#prime
def isPrime(x):
if x<=1: return False
for i in range(2, int(x**0.5)+1):
if x%i==0:
return False
return True
# Union Find
# p = {i:i for i in range(1, n+1)}
def find(x):
if x == p[x]:
return x
q = find(p[x])
p[x] = q
return q
def union(x, y):
x = find(x)
y = find(y)
if x != y:
p[y] = x
def getPow(a, x):
ret = 1
while x:
if x&1:
ret = (ret * a) % MOD
a = (a * a) % MOD
x>>=1
return ret
def getInv(x):
return getPow(x, MOD-2)
|
cs |
union()과 find()는 위의 템플릿 코드에 들어있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sys.setrecursionlimit(10**6)
n, m = mip()
p = [i for i in range(n)]
for i in range(1, m + 1):
a, b = mip()
if find(a) == find(b):
print(i)
exit()
union(a, b)
print(0)
|
cs |
'백준 문제풀이' 카테고리의 다른 글
백준 3056 - 007 [Python] (0) | 2021.09.02 |
---|---|
백준 1311 - 할 일 정하기 1 [Python] (0) | 2021.09.02 |
백준 9372 - 상근이의 여행 [Python] (0) | 2021.09.02 |
백준 13925 - 수열과 쿼리 13 [Python] (0) | 2021.08.31 |
백준 10999 - 구간 합 구하기 2 [Python] (0) | 2021.08.31 |