https://www.acmicpc.net/problem/20040
유니온 파인드로 풀이할 수 있는 전형적인 문제였다.
입력 노드들을 유니온 파인드 연산으로 처리하며 이미 같은 분리집합 내에
속한 노드들에 대한 입력이 주어졌을 때 사이클이 발생한 것이므로
순서를 기록하여 답을 도출할 수 있다.
로직의 시간복잡도는 입력의 처리하는 부분에서 으로 수렴하므로
,인 최악의 경우에도 무난히 제한 조건 1초를
통과할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import static java.lang.Integer.parseInt;
public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = parseInt(st.nextToken());
int m = parseInt(st.nextToken());
parent = new int[n];
Arrays.fill(parent, -1);
int u, v, r1, r2;
int seq = 0;
for (int i = 1; i <= m; i++) {
st = new StringTokenizer(br.readLine());
u = parseInt(st.nextToken());
v = parseInt(st.nextToken());
r1 = find(u);
r2 = find(v);
if (r1 == r2) {
if (seq == 0) {
seq = i;
} else {
seq = Math.min(seq, i);
}
continue;
}
if (parent[r1] < parent[r2]) {
parent[r1] += parent[r2];
parent[r2] = r1;
} else {
parent[r2] += parent[r1];
parent[r1] = r2;
}
}
System.out.println(seq);
br.close();
}
static int find(int u) {
if (parent[u] < 0) return u;
return parent[u] = find(parent[u]);
}
}