https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
[난이도] Gold4
[유형] 분리집합
[풀이]
Disjoint set을 이용해서 해결할 수 있다.
두 점을 이을때마다 merge 연산을 수행하고, 만약 두 점이 이미 같은 집합이라면
이 두 점을 연결하는 순간 싸이클이 되므로 이 때가 정답이다.
#include <cstdio>
using namespace std;
int N,M,uf[500000];
int find(int a){
if(uf[a]==a) return a;
return uf[a] = find(uf[a]);
}
bool merge(int a,int b){
a=find(a);
b=find(b);
if(a==b) return 0;
uf[a]=b;
return 1;
}
int main(){
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++) uf[i]=i;
for(int i=1;i<=M;i++){
int u,v;
scanf("%d%d",&u,&v);
if(!merge(u,v)){
printf("%d",i);
return 0;
}
}
puts("0");
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/20040.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 2550 : 전구 (C++) (0) | 2021.02.14 |
---|---|
[BOJ/백준][Gold4] 3908 : 서로 다른 소수의 합 (C++) (0) | 2021.02.06 |
[BOJ/백준][Gold4] 16172 : 나는 친구가 적다(large) (C++) (0) | 2021.02.06 |
[BOJ/백준][Gold4] 1322 : X와 K (C++) (0) | 2021.02.06 |
[BOJ/백준][Gold4] 9007 : 카누 선수 (C++) (0) | 2021.02.06 |