[BOJ] 20040 사이클 게임

유니온-파인드


이 문제는 간선들의 정보가 주어지고 이를 이었을 때 사이클이 언제 발생하는지 출력하는 문제이다. 이런 유형의 경우 union-find를 이용해서 root노드가 같을 경우를 사이클로 판별하면 되는 문제이다.

따라서 간단하게 union, find 함수를 구현하고 find == find 라면 stop하고 출력하면 되는 문제이다.

구현


import sys

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

def union(a, b, parent):
    a = find(a, parent)
    b = find(b, parent)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b
    return parent

def solution(n):
    parent = [i for i in range(n)]
    for i in range(len(edges)):
        a, b = edges[i][0], edges[i][1]
        if find(a, parent) == find(b, parent):
            return i + 1
        parent = union(a, b, parent)
    return 0

if __name__ == "__main__":
    N, M = map(int, sys.stdin.readline().rstrip().split())
    edges = []
    for _ in range(M):
        A, B = map(int, sys.stdin.readline().rstrip().split())
        edges.append([A, B])
    print(solution(N))

태그:

카테고리:

업데이트: