본문 바로가기

알고리즘/백준

[백준] 20040번 : Cycle Game

728x90

해당 문제는 서로소 집합 문제로 사이클이 생겼는지 안생겼는지에대한 판별을 하는 문제이다.

<aside> 💡 여기서 실수한건 union 함수에서 각각의 원래의 부모의 값을 업데이트 해주어야 하는데, 자기자신의 부모값을 업데이트 하는 실수를 하였다. 또한 M 번째에서 사이클이 발생할 경우도 예외 처리를 해주어야한다.

</aside>

import sys
input = sys.stdin.readline
N, M = map(int, input().split())
parent = [i for i in range(N)]

def find(v1):
    if parent[v1] != v1:
        parent[v1] = find(parent[v1])
        return parent[v1]
    else:
        return v1

def union(v1, v2):
    p1 = find(v1)
    p2 = find(v2)

    if p1 > p2:
        parent[p1] = p2
    else:
        parent[p2] = p1

cnt = 0
iscycle = False
for _ in range(M):
    v1, v2 = map(int, input().split())
    p1 = find(v1)
    p2 = find(v2)
    cnt += 1
    if p1 == p2: # Cycle Made
        iscycle = True
        break
    else:
        union(v1, v2)

if cnt == M and not iscycle:
    print(0)
else:
    print(cnt)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14718번 : 빗물  (1) 2023.10.18
[백준] 9012번 : 괄호  (1) 2023.10.18
[백준] 10775번 : 공항  (1) 2023.10.18
[백준] 1189번 : 컴백홈  (0) 2023.10.18
[백준] 7579번 : 앱  (0) 2023.10.18