https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
union-find를 알고있다면 쉽게 풀 수 있는 문제이다. 간략하게 설명하자면, 각 노드는 자신의 부모를 가리키게 되어있는데, 이 때 새로운 두 개의 노드에 대해 같은 부모를 가리키고 있으면 사이클이 형성된다.
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <memory.h>
#include <vector>
#define endl '\n'
#define ll long long
#define pii pair<int, int>
#define max 987654321
using namespace std;
int n;
int m;
int parent[500001];
int _find(int i)
{
if (parent[i] == i)
{
return i;
}
else
{
parent[i] = _find(parent[i]);
return parent[i];
}
}
void _union(int x, int y)
{
x = _find(x);
y = _find(y);
if (x > y)
{
parent[y] = x;
}
else
{
parent[x] = y;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
parent[i] = i;
}
int s, e;
for (int i = 1; i <= m; i++)
{
cin >> s >> e;
if (_find(s) == _find(e))
{
cout << i << endl;
return 0;
}
else
{
_union(s, e);
}
}
cout<<0<<endl;
return 0;
}
'코딩테스트 > C++' 카테고리의 다른 글
[백준 BOJ] 2252번 - 줄 세우기 (C++) (0) | 2024.03.11 |
---|---|
[백준 BOJ] 2143번 - 두 배열의 합 (C++) (0) | 2024.03.10 |
[백준 BOJ] 17404번 - RGB거리 2(C++) (0) | 2024.03.10 |
[백준 BOJ] 10942번 - 팰린드롬? (C++) (1) | 2024.02.10 |
[백준 BOJ] 2239번 - 스도쿠 (C++) (1) | 2024.02.08 |