직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.
![[백준][C++] 20040번: 사이클 게임 <230> [백준][C++] 20040번: 사이클 게임 <230>](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한...
www.acmicpc.net
생각의 흐름
대표적인 Union Find 문제인것 같다.
Union Find 알고리즘이 궁금하다면 다음 글을 읽어보길 권장한다.
https://blogshine.tistory.com/103
[알고리즘] Union Find 알고리즘 : 경로 압축
기존에도 Union Find 알고리즘을 사용하기는 했지만, 경로 압축을 하고있지 않아 시간이 조금더 걸리는 문제가 있었다. 간단하게 경로압축을 할 수 있는 방법을 배워 글을 써본다. Union & Find " data-ke...
blogshine.tistory.com
나의 코드
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define MAX 500001
int N, M;
int cnt = 1;
int parent[MAX];
int find(int u) {
if(parent[u] == u) {
return u;
}
return parent[u] = find(parent[u]);
}
bool unionNode(int u, int v)
{
u = find(u);
v = find(v);
// 부모노드가 같으면 사이클이 생기므로 true 반환
if (u == v) return true;
else // 노드 결합
{
parent[u] = v;
return false;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for(int i = 0; i < N; i++) {
parent[i] = i;
}
for(int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
if(unionNode(a, b)){
cout << i+1;
return 0;
}
}
cout << 0;
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
[백준][C++] 12893번: 적의 적 <232> (0) | 2022.07.07 |
---|---|
[백준][C++] 11085번: 군사 이동 <231> (0) | 2022.07.01 |
[백준][C++] 16724번: 피리 부는 사나이 <229> (0) | 2022.06.22 |
[백준][C++] 9328번: 열쇠 <228> (0) | 2022.06.10 |
[백준][C++] 1389번: 케빈 베이컨의 6단계 법칙 <227> (0) | 2022.06.08 |
댓글