https://www.acmicpc.net/problem/1922
1. 아이디어
선은 두 컴퓨터에 대한 양방향 연결이 되고 컴퓨터와 컴퓨터를 연결하는 선에 대해 모든 컴퓨터를 연결하는 최소 비용을 구하는 문제로 최소 스패닝 트리를 구하는 문제가 되고 크루스칼 알고리즘을 활용해서 해결했다.
2. 문제풀이
유니온 파인드 알고리즘을 활용한 분리 집합과 우선순위 큐를 활용한 간선 정렬로 크루스칼 알고리즘을 구현했다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
private static class Edge implements Comparable<Edge> {
int a;
int b;
int w;
public Edge(int a, int b, int w) {
this.a = a;
this.b = b;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.w, o.w);
}
}
private static int[] p;
private static int[] make(int N) {
int[] arr = new int[1 + N];
for (int i = 1; i <= N; i++) arr[i] = i;
return arr;
}
private static int find(int x) {
if (x == p[x]) return x;
return p[x] = find(p[x]);
}
private static void union(int x, int y) {
p[find(y)] = find(x);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
PriorityQueue<Edge> edges = new PriorityQueue<>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
edges.add(new Edge(A, B, W));
}
int ans = kruskal(N, edges);
System.out.println(ans);
}
private static int kruskal(int N, PriorityQueue<Edge> edges) {
p = make(N);
int sum = 0;
int cnt = 0;
while (!edges.isEmpty()) {
Edge e = edges.remove();
if (find(e.a) == find(e.b)) continue;
union(e.a, e.b);
sum += e.w;
cnt++;
if (cnt == N - 1) return sum;
}
return -1;
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 4386번 - 별자리 만들기 [Java] (0) | 2025.02.11 |
---|---|
[백준] 21924번 - 도시 건설 [Java] (0) | 2025.02.11 |
[백준] 1197번 - 최소 스패닝 트리 [Java] (0) | 2025.02.11 |
[백준] 9372번 - 상근이의 여행 [Java] (0) | 2025.02.11 |
[백준] 9466번 - 텀 프로젝트 [Java] (0) | 2025.02.10 |