Algorithm/백준

[백준][C++] 20040번: 사이클 게임 <230>

샤아이인 2022. 6. 23.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

https://www.acmicpc.net/problem/20040

 

20040번: 사이클 게임

사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한

www.acmicpc.net

 

생각의 흐름

대표적인 Union Find 문제인것 같다.

Union Find 알고리즘이 궁금하다면 다음 글을 읽어보길 권장한다.

https://blogshine.tistory.com/103

 

[알고리즘] Union Find 알고리즘 : 경로 압축

기존에도 Union Find 알고리즘을 사용하기는 했지만, 경로 압축을 하고있지 않아 시간이 조금더 걸리는 문제가 있었다. 간단하게 경로압축을 할 수 있는 방법을 배워 글을 써본다. Union & Find " data-ke

blogshine.tistory.com

나의 코드

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define MAX 500001

int N, M;
int cnt = 1;
int parent[MAX];

int find(int u) {
    if(parent[u] == u) {
        return u;
    }
    return parent[u] = find(parent[u]);
}

bool unionNode(int u, int v)
{
    u = find(u);
    v = find(v);

    // 부모노드가 같으면 사이클이 생기므로 true 반환
    if (u == v) return true;
    else // 노드 결합
    {
        parent[u] = v;
        return false;
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M;
    for(int i = 0; i < N; i++) {
        parent[i] = i;
    }
    for(int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        if(unionNode(a, b)){
            cout << i+1;
            return 0;
        }
    }
    cout << 0;
    return 0;
}

댓글