[파이썬] 백준 20040번 사이클 게임

작성:

백준 #20040 사이클 게임


# 평면상의 점 n개
# 어느 세 점도 일직선 위에 놓이지 않는다.
# 사이클: 한 끝점에서 모든 선분을 한 번씩만 지나 출발점으로 되돌아온다
# 사이클이 완성되었는지 판단하는 프로그램

# 출력: 
    # m번째 차례까지 하는 동안 이미 게임이 종료되었으면: 처음 번호
    # m번째 차례까지도 종료되지 않았으면 0출력

# 체크할 조건
# 0 <= n <= 500000 // 3 <= m <= 1000000
    # 입력이 많다 (m개)
# n개의 점은 0부터 n-1의 번호

# union-find 자료구조를 사용해본다.
# 새로 들어오는 a, b 둘다 이미 같은 집합에 있다면
    # find(a) == find(b)라면 사이클 완성

import sys
input = sys.stdin.readline

def find(x, parents):
    if parents[x] == x: return x
    parents[x] = find(parents[x], parents)
    return parents[x]

def union(x, y, parents, ranks):
    xroot = find(x, parents)
    yroot = find(y, parents)
    if ranks[xroot] >= ranks[yroot]:
        parents[yroot] = xroot
    else:
        parents[xroot] = yroot
    if ranks[xroot] == ranks[yroot]:
        ranks[xroot] += 1

def solution(n, m):
    parents = [i for i in range(n)]
    ranks = [0 for i in range(n)]
    result = 0
    found = False
    for i in range(1, m+1):
        a, b = map(int, input().split())
        if found: continue
        if find(a, parents) == find(b, parents):
            result = i
            found = True
        else:
            union(a, b, parents, ranks)
    print(result)

if __name__ == '__main__':
    solution(*map(int, input().split()))

댓글남기기