https://www.acmicpc.net/problem/1197

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 = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
PriorityQueue<Edge> edges = new PriorityQueue<>();
for (int i = 0; i < E; 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(V, edges);
System.out.println(ans);
}
private static int kruskal(int V, PriorityQueue<Edge> edges) {
p = make(V);
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 == V - 1) return sum;
}
return -1;
}
}
4. 후기

'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 21924번 - 도시 건설 [Java] (0) | 2025.02.11 |
---|---|
[백준] 1922번 - 네트워크 연결 [Java] (0) | 2025.02.11 |
[백준] 9372번 - 상근이의 여행 [Java] (0) | 2025.02.11 |
[백준] 9466번 - 텀 프로젝트 [Java] (0) | 2025.02.10 |
[백준] 9205번 - 맥주 마시면서 걸어가기 [Java] (0) | 2025.02.10 |