풀이 방법
유니온 파인드라는 자료구조를 이용하여 풀이하였다.
입력받은 두개의 루트 노드가 같으면 사이클이 형성되었다고 판단하고, 다르다면 두개의 트리를 합친다.
코드
#include <cstdio>
#include <algorithm>
using namespace std;
int par[500005], level[500005];
int find(int x) {
if (x == par[x]) return x;
return par[x] = find(par[x]);
}
void merge(int x, int y) {
int a = find(x), b = find(y);
if (a == b) return;
if (level[a] > level[b]) swap(a, b);
if (level[a] == level[b]) level[b]++;
par[a] = b;
}
int main() {
int N, M; scanf("%d %d", &N, &M);
for (int i = 0; i <= N; i++) {
par[i] = i;
level[i] = 1;
}
for (int i = 1; i <= M; i++) {
int a, b; scanf("%d %d", &a, &b);
int x = find(a), y = find(b);
if (x != y) merge(x, y);
else { printf("%d", i); return 0; }
}
printf("0");
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[2887] 행성터널 (0) | 2021.06.22 |
---|---|
백준[1774] 우주신과의 교감 (0) | 2021.06.22 |
백준[4386] 별자리 만들기 (0) | 2021.06.22 |
백준[9372] 상근이의 여행 (0) | 2021.06.21 |
백준[2629] 양팔저울 (1) | 2021.05.03 |