728x90
https://www.acmicpc.net/problem/20955
20955번: 민서의 응급 수술
민서는 강원대학교 컴퓨터공학과의 신임 교수이다. 그녀가 저술한 효율적인 택배 배달을 위한 최적 경로 설계에 관한 연구 논문은 아직도 널리 인용되고 있다. 오늘도 열심히 강의를 하던 민서
www.acmicpc.net
728x90
메모리: 39,596 KB , 시간: 388 ms
사용 알고리즘: 유니온 파인드, 트리, 그래프 탐색, 그래프 이론
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] parent;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 유니온 파인드에 쓰일 부모 배열
parent = new int[N + 1];
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
int u, v;
int result = 0;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
// 이미 연결되어 있는 경우 필요없는 연결 -> 연결을 끊어준다
if(!union(u, v)) result++;
}
// 아직 연결되지 않은 뉴런이 있는 경우 새로 연결해준다
for (int i = 2; i <= N; i++) {
if (find(i) != 1) {
parent[i] = 1;
result++;
}
}
// 답 출력
System.out.println(result);
}
private static int find(int a) {
if(a == parent[a]) return a;
return parent[a] = find(parent[a]);
}
private static boolean union(int a, int b) {
a = find(a);
b = find(b);
if(a == b) return false;
if(a < b) parent[b] = a;
else parent[a] = b;
return true;
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 13905] 세부 (java) (0) | 2024.02.09 |
---|---|
[백준, BOJ 17179] 케이크 자르기 (java) (0) | 2024.02.09 |
[백준, BOJ 1766] 문제집 (java) (0) | 2024.02.04 |
[백준, BOJ 17396] 백도 (java) (1) | 2024.02.04 |
[백준, BOJ 18866] 젊은 날의 생이여 (java) (0) | 2024.02.04 |