1 분 소요

사이클 게임 (백준 Gold 4)

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

평면의 점 n과 진행한 선 그리기 개수 m이 주어질 때
m번 그렸을때 도중 사이클이 발생하는지 확인하고
그 발생 타이밍을 출력하는 문제

  • 다만 발생하지 않았다면 0을 출력

풀이 방법

분리 집합을 이용하여 풀 수 있는 문제
실제로 그래프를 그릴 필요는 없음
(비용에 대한 별도의 처리가 들어가지 않으며
Edge라 하기에는 다소 작은 개념)

  • m번 순회하며
    주어지는 정보를 통하여 Union하며 체크

  • 처음 사이클이 발생한 경우에만 저장

제출 코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int FindParent(vector<int>& pv, int x)
{
	if (pv[x] == x)
		return x;

	return pv[x] = FindParent(pv, pv[x]);
}

bool Union(vector<int>& pv, int a, int b)
{
	a = FindParent(pv, a);
	b = FindParent(pv, b);
	if (a == b)
		return false;

	pv[a] = b;

	return true;
}

int main()
{
	int n, m;
	cin >> n >> m;

	vector<int> pv(n);
	for (int i = 0; i < n; i++)
		pv[i] = i;

	int ans = 0;

	for (int i = 0; i < m; i++)
	{
		int t1, t2;
		cin >> t1 >> t2;
		if (ans == 0 &&
			Union(pv, t1, t2) == false)
		{
			ans = i + 1;
		}
	}

	cout << ans;

	return 0;
}

결과

Image

전형적인 분리 집합에 대한 문제
최근에는 MST와 분리 집합 계열의 문제를 반복적으로 풀며
감을 익히고 있다

댓글남기기