PS
[C++] 사이클 게임 (백준 20040번)
jungh150c
2025. 5. 19. 23:13
https://www.acmicpc.net/problem/20040
유니온 파인드를 이용하여 간선을 하나씩 추가하면서 사이클이 처음 생기는 순간만 찾아주면 된다.
a와 b가 이미 같은 집합인데 a와 b를 연결하는 간선이 들어오면 사이클이 생긴 것이라고 판단하면 된다.
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> parent;
int find(int a) {
if (parent[a] == a) return a;
else return parent[a] = find(parent[a]);
}
int unite(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
parent[b] = a;
return true;
} else {
return false; // 사이클 발생
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
parent = vector<int>(n + 1);
for (int i = 0; i < n; i++) parent[i] = i;
for (int i = 1; i < m + 1; i++) {
int a, b;
cin >> a >> b;
if (!unite(a, b)) {
cout << i << '\n';
return 0;
}
}
cout << "0\n";
}
(AC)