https://www.acmicpc.net/problem/20040
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
솔루션
처음에.. 모든 노드를 다 둘러서 다시 시작점으로 와야 하는 줄 알고 착각하고.. 문제 어렵다 생각했는데,
문제를 다시 보니, 특정 점에서 얼만큼 방문하던, 다시 특정 점으로 오면 된다고 한다. (이래서 글을 유심히 읽어야 한다.)
그래서 생각을 해 낸 것이,
UnionFind이다.
각각의 선분을 그을 때, 이를 하나의 집합으로 연결 시킨다.
이 때, 선분을 그었는데, 이미 같은 집합이라면, 사이클이 반드시 생기는데, 몇번째에 같은 집합을 합치는 지 출력을 하면 된다.
코드
#include <iostream>
using namespace std;
int parent[500002];
int N, M;
int getParent(int x) {
if (x == parent[x]) return x;
else return parent[x] = getParent(parent[x]);
}
bool IsUnion(int a, int b) {
a = getParent(a);
b = getParent(b);
return a == b;
}
void SetUnion(int a, int b) {
a = getParent(a);
b = getParent(b);
a > b ? parent[b] = a : parent[a] = b;
}
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;
for (int i = 1; i <= M; i++) {
int a, b;
cin >> a >> b;
if (!IsUnion(a, b)) {
SetUnion(a, b);
}
else {
cout << i << "\n";
return 0;
}
}
cout << "0\n";
return 0;
}
'백준' 카테고리의 다른 글
C++[백준]16198번 에너지 모으기 (0) | 2023.03.07 |
---|---|
C++[백준]16968 차량 번호판 1 (0) | 2023.03.07 |
C++[백준]1781번 컵라면 (0) | 2023.02.14 |
C++[백준]16496번 큰 수 만들기 (0) | 2023.02.13 |
C++[백준]2473번 세 용액 (0) | 2023.02.13 |