Algorithm/Baekjoon
[Algorithm]Baekjoon 20040 :: 사이클 게임
MaxLevel
2024. 3. 5. 14:05
https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
using namespace std;
int n, m;
int parents[500001] = { 0 };
int getParent(int node)
{
if (node == parents[node]) return node;
return parents[node] = getParent(parents[node]);
}
void unionParents(int nodeA, int nodeB)
{
nodeA = getParent(nodeA);
nodeB = getParent(nodeB);
if (nodeA < nodeB) parents[nodeB] = nodeA;
else parents[nodeA] = nodeB;
}
bool isSameParents(int nodeA, int nodeB)
{
nodeA = getParent(nodeA);
nodeB = getParent(nodeB);
if (nodeA == nodeB) return true;
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
parents[i] = i;
}
for (int i = 0; i < m; ++i)
{
int a, b;
cin >> a >> b;
if (isSameParents(a, b))
{
cout << i + 1;
return 0;
}
else
{
unionParents(a, b);
}
}
cout << 0;
}
|
cs |
문제난이도에 비해 괜시리 설명이 복잡한 문제이다.
그냥 Union-Find를 이용해서 합집합을 해주면 된다. 싸이클이 발생할 경우, 즉 이미 같은 집합인 노드를 합치려고 시도할 경우, 사이클이 발생했다고 가정하고 해당 턴을 출력해주면 된다.