득이공간

[백준 C++] 20040 사이클 게임 - 분리집합 본문

PS/알고리즘 문제풀이

[백준 C++] 20040 사이클 게임 - 분리집합

쟁득 2024. 2. 26. 10:54
 

20040번: 사이클 게임

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

www.acmicpc.net

#include <iostream>
using namespace std;

int Root[500000];

int Find(int Node)
{
	if (Node == Root[Node])
	{
		return Node;
	}

	return Root[Node] = Find(Root[Node]);
}

bool Cycle(int NodeA, int NodeB)
{
	int RootA = Find(NodeA);
	int RootB = Find(NodeB);

	if (RootA == RootB)
	{
		return true;
	}

	// Union
	int NewRoot = min(RootA, RootB);
	Root[RootA] = NewRoot;
	Root[RootB] = NewRoot;

	return false;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	int N, M;
	cin >> N >> M;

	for (int i = 0; i < N; ++i)
	{
		Root[i] = i;
	}

	bool bFound = false;
	int Cnt = 0;
	for (int i = 1; i <= M; ++i)
	{
		int A, B;
		cin >> A >> B;

		if (!bFound && Cycle(A, B))
		{
			bFound = true;
			Cnt = i;
		}
	}

	cout << Cnt;
}

 

일반적인 분리 집합 유형의 문제입니다.

유니온 연산을 입력했을 때 두 노드의 루트 노드가 같다면 사이클이 만들어지게 됩니다.

따라서 사이클이 처음 만들어지는 해당 차례를 출력해주면 됩니다.