득이공간
[백준 C++] 20040 사이클 게임 - 분리집합 본문
#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;
}
일반적인 분리 집합 유형의 문제입니다.
유니온 연산을 입력했을 때 두 노드의 루트 노드가 같다면 사이클이 만들어지게 됩니다.
따라서 사이클이 처음 만들어지는 해당 차례를 출력해주면 됩니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 2143 두 배열의 합 - 이분탐색 (0) | 2024.02.26 |
---|---|
[백준 C++] 1644 소수의 연속합 - 에라토스테네스의체 (1) | 2024.02.26 |
[백준 C++] 10942 팰린드롬? - 다이나믹프로그래밍 (0) | 2024.02.23 |
[백준 C++] 9252 LCS 2 - 다이나믹프로그래밍 (0) | 2024.02.23 |
[백준 C++] 2239 스도쿠 - 백트래킹 (0) | 2024.02.23 |