백준 알고리즘
[백준 문제풀이] 백준 20040 c++ 사이클 게임
mindun
2025. 2. 14. 10:45
반응형

유니온 파인드를 활용해서 풀 수 있는 문제
유니온 파인드란?
- 여러 개의 부분집합을 루트를 기준으로 병합, 각 원소의 루트 찾기를 할 수 있는 자료구조
초기화: 각 노드는 자신의 번호로 초기화 list[i] = i;
find 과정(루트 찾기): list[a] = b 로, 루트와 연결된 노드의 값을 이용하여 루트 값을 반환 하도록 하는 함수
union 과정(병합): find 함수를 이용하여 두 수의 루트 값을 찾고, 그 값이 같다면 같은 부분집합이며 다르다면 병합 할 수 있도록 하는 함수
#include <iostream>
#include <algorithm>
int list[500001] = {};
int check = 0;
void init(int n) {
for (int i{ 0 }; i <= n; i++) list[i] = i;
}
int find(int n) {
if (list[n] == n) return n;
else return find(list[n]);
}
void merge(int a, int b) {
a = find(a);
b = find(b);
if (a == b) {
return;
}
else list[b] = a;
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n, m;
std::cin >> n >> m;
init(n);
int a, b;
int ans = 0;
for (int i{ 0 }; i < m; i++) {
std::cin >> a >> b;
if (ans) continue;
else if (find(a) == find(b)) {
ans = i + 1;
}
else merge(a, b);
}
if (!ans) std::cout << "0\n";
else std::cout << ans << "\n";
}
반응형