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
'PS > BOJ' 카테고리의 다른 글
백준 17608 (C++) 막대기 (0) | 2021.10.23 |
---|---|
백준 2935 (C++) 소음 (출력 초과, 틀렸습니다) (0) | 2021.10.20 |
백준 11403 (C++) 경로 찾기 (0) | 2021.10.18 |
백준 1939 (C++) 중량제한 (메모리 초과 -> 4496KB, 시간-32ms) (0) | 2021.10.15 |
백준 1976 (C++) 여행 가자 (틀렸습니다, 까닭) (2) | 2021.10.14 |