어흥

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

알고리즘/백준

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

라이언납시오 2021. 8. 30. 18:26
728x90
반응형

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

 

20040번: 사이클 게임

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

www.acmicpc.net

1. 주의할 점

- 분리집합 알고리즘에 대해 알고 있어야 한다

 

2. 구현

- findPar() 함수를 통해 해당 Node의 부모를 반환하는 함수를 구현한다

- makeUnion() 함수를 통해 a와 b의 최상위 부모를 연결한다

- M개의 선분을 입력받으면서 해당 선분의 부모가 같지 않으면 makeUnion()을 통해 같게 해준다. 만약 같고 finish 값이 0이 아니라면 finish의 값을 갱신한다

#include <iostream>
using namespace std;
int node,edge,from,to;
int par[500000];

int findPar(int x){
    if(par[x]==x) return x;
    return par[x] = findPar(par[x]);
}

void makeUnion(int a, int b){
    int pa = findPar(a);
    int pb = findPar(b);
    if(pa<pb) par[pb]=pa;
    else if(pa>pb) par[pa]=pb;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin>>node>>edge;
    int finish=0;
    for(int i=0;i<node;i++)
        par[i]=i;
    for(int i=1;i<=edge;i++){
        cin>>from>>to;
        if(finish!=0) continue;
        int pf = findPar(from);
        int pt = findPar(to);
        if(pf!=pt)  makeUnion(from,to);
        else finish=i;
    }
    cout<<finish;
    return 0;
}
728x90
반응형

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

[백준 22867] 종점 (C++)  (0) 2021.10.02
[백준 17612] 쇼핑몰 (C++)  (0) 2021.10.02
[백준 2696] 중앙값 구하기 (C++)  (0) 2021.08.20
[백준 15903] 카드 합체 놀이 (C++)  (0) 2021.08.20
[백준 11003] 최솟값 찾기 (C++)  (0) 2021.08.20
Comments