본문 바로가기

백준

C++[백준]20040번 사이클 게임

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