오늘의 알고리즘

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

하늘하늘 . 2022. 12. 21. 23:47
#include <iostream>
#include <algorithm>
 
int parent[500001] = {};
 
int FindParent(int x)
{
	if (parent[x] == x) 
		return x;
 
	else 
		return parent[x] = FindParent(parent[x]);
}
 
bool UnionParent(int x, int y)
{
	x = FindParent(x);
	y = FindParent(y);
 
 
	if (x != y)
	{
		parent[y] = x;
		return false;
	}
 
	else
		return true;
}
 
int main() 
{	
	int n = 0;
	int m = 0;
	std::cin >> n >> m;
	int ans = 1000001;
 
	for (int i = 0; i < n; ++i)
	{
		parent[i] = i;
	}
 
	for (int i = 1; i <= m; i++)
	{
		int x = 0;
		int y = 0;
		std::cin >> x >> y;
 
		if (UnionParent(x, y) && ans == 1000001)
		{
        	ans = i;
		}
	}
 
	if (ans == 1000001)
		std::cout << 0;
	else 
		std::cout << ans;
 
	return 0;
}

두 개의 점을 하나의 부모로 만들어서 연결을 시키는 문제입니다.

연결시키면서 선분이 연결되어 있지 않다면 처음으로 연결하는 것이기 때문에 부모를 이전 선분에 연결합니다. 

연결이 되어있을 경우 이미 선분이 연결되어 있다는 뜻이기 때문에 싸이클이 돌았다는 뜻입니다. 

그렇기 때문에  입력만을 계속 돌리고 끝을 냅니다.