티스토리 뷰

백준/골드

[백준 20040번] 사이클 게임 (C++)

게임개발기원 2023. 9. 13. 17:42

문제링크 : https://www.acmicpc.net/problem/20040

 

20040번: 사이클 게임

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, M, result = 0;
int parent[500001];

int find_root(int x)
{
    if(x == parent[x]) return x;  //루트노드면 그대로 반환
    return parent[x] = find_root(parent[x]);  //자식노드면 부모노드로 다시 탐색
}

void Union(int a, int b)
{
    a = find_root(a);
    b = find_root(b);
    if(a!=b)
    {
        parent[a]=b;  //속한 트리가 다르다면 병합시킴 (Union)
    }
}

bool check(int a, int b) //이어졌는가?
{
    a=find_root(a);
    b=find_root(b);
    if(a==b) return 1;
    return 0;
}

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

    cin >> N >> M; 
    int u, v;
    for(int i=0; i<N; i++)
    {
        parent[i]=i;
    }

    for(int i=1; i<=M; i++)
    {
        cin >> u >> v;
        if(check(u, v)) //사이클 유무 확인
        {
            result = i;
            break;
        }
        else Union(u, v);
    }

    cout << (result == 0 ? 0 : result);
    return 0;
}

Union Find의 전형적인 문제이다.

 

먼저 사이클이 완성되었는지 확인하기 위해 현재 입력받은 간선에 대해서 check를 해주고 이어져있다면 사이클이 있는 것이므로 현재 i를 저장하고 종료해준다.

이어져있지 않다면 현재 입력받은 간선에 대해 Union을 진행하고 이후 사이클 유무를 계속해서 탐색한다.

 

result의 값이 초기값 0 그대로 이면 사이클이 없는 것이므로 초기값 그대로 0을 출력하고 사이클이 생겼다면 앞서 저장한 i값이 담긴 result를 력해준다.

'백준 > 골드' 카테고리의 다른 글

[백준 1509번] 팰린드롬 분할 (C++)  (0) 2023.09.17
[백준 9252번] LCS 2 (C++)  (0) 2023.09.14
[백준 1377번] 버블 소트 (C++)  (0) 2023.09.12
[백준 2580번] 스도쿠 (C++)  (0) 2023.09.11
[백준 2239번] 스도쿠 (C++)  (0) 2023.09.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함