쌓고 쌓다

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

알고리즘/백준

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

승민아 2022. 4. 2. 18:38

https://www.acmicpc.net/problem/20040

 

20040번: 사이클 게임

사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한

www.acmicpc.net

#include <iostream>
using namespace std;
int N, M;
int parent[1000001];

int find(int a)
{
	if (parent[a] == a)
		return a;

	return parent[a]=find(parent[a]);
}

void Union(int a, int b)
{
	a = find(parent[a]);
	b = find(parent[b]);

	if (a != b)
	{
		if (a >= b)
			parent[a] = b;
		else
			parent[b] = a;
	}
}

bool Parent(int a, int b)
{
	a = find(a);
	b = find(b);
	if (a != b)
		return false;
	return true;
}
int main(void)
{
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(false);

	cin >> N >> M;
	for (int i = 0; i < N; i++)
		parent[i] = i;

	int a, b;
	for (int i = 0; i < M; i++)
	{
		cin >> a >> b;	
		if (Parent(a, b))
		{
			cout << i + 1;
			return 0;
		}
		Union(a, b);
	}
	cout << "0";
}

 

Union-Find 알고리즘으로 풀어지는 문제입니다.

연결하기 전 두 노드의 부모가 같은지 확인합니다.

만약 같은 부모라면 연결하면 사이클이 생기겠지요.

부모가 다르다면 그냥 연결해줍니다.

Comments