백준 20040 (C++) 사이클 게임
728x90
SMALL

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

 

20040번: 사이클 게임

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

www.acmicpc.net

 

 

 

 

 

 

아이디어

분리집합을 알면 날먹 가능한 문제

이 유형이 대체로 티어가 높게 잡혀 날먹하기 좋다

 

 

입력받는 두 노드를 merge하기 전 사이클이 생기는지 확인한다.

사이클이 생긴다면 그대로 그때의 iteration(<= m, m보다 작음)값을 출력한다.

사이클이 생기지 않아 반복문을 종료하여 빠져나왔다면 "0"을 출력한다

 

 

 

 

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
using ll = long long;
const int INF = 1e8;
const int MAX = 500003;
int n,m;
int Parent[MAX];
int getParent(int n1) {
    if (Parent[n1] == n1) return n1;
    else return Parent[n1] = getParent(Parent[n1]);
}
void unionParent(int n1, int n2) {
    n1 = getParent(n1);
    n2 = getParent(n2);
    if (n1 != n2) {
        Parent[n2] = n1;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n >> m;
    
    for (int i = 0; i < n; i++) {
        Parent[i] = i;
    }
    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        if (getParent(a) == getParent(b)) {
            cout << i;
            return 0;
        }
        unionParent(a, b);
    }
    cout << "0";
    return 0;
}

 

 

728x90
LIST