728x90
문제 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int find( int x, int p[] ) {
if( x == p[x] ) return x;
return p[x] = find( p[x], p );
}
public static boolean union( int a, int b, int p[] ) {
if( a == b ) return true;
a = find( a, p );
b = find( b, p );
if( a == b ) return true;
p[b] = a;
return false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
StringTokenizer st = new StringTokenizer( br.readLine() );
int n = Integer.parseInt( st.nextToken() ),
m = Integer.parseInt( st.nextToken() ), a, b, c = 0, i;
int p[] = new int[n];
boolean f = false; // f -- isCycle
for( i = 0; i < n; i++ )
p[i] = i;
for( i = 0; i < m; i++ ) {
st = new StringTokenizer( br.readLine() );
a = Integer.parseInt( st.nextToken() );
b = Integer.parseInt( st.nextToken() );
if( !f && union( a, b, p ) ) {
f = true;
c = i+1;
}
}
br.close();
System.out.println( c );
}
}
* 유니온 파인드
- 간선 입력받을 때 두 정점을 union() 함
이미 같은 집합 안에 있을 경우 사이클이므로 true 반환, 사이클이 아니면 false 반환
- boolean f ( flag ) 변수로 사이클이 처음 나올 때를 체크
사이클이 처음 등장하는 경우 f가 true가 되고, 몇 번째인지를 구해 출력
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 3273 : 두 수의 합 / 투 포인터 (0) | 2021.01.29 |
---|---|
[백준(Baekjoon)][자바(java)] 17472 : 다리 만들기 2 / 최소 신장 트리 (0) | 2021.01.29 |
[백준(Baekjoon)][자바(java)] 4803 : 트리 / 트리 (0) | 2021.01.29 |
[백준(Baekjoon)][자바(java)] 1707 : 이분 그래프 / DFS와 BFS (0) | 2021.01.21 |
[백준(Baekjoon)][자바(java)] 7562 : 나이트의 이동 / DFS와 BFS (0) | 2021.01.21 |