https://www.acmicpc.net/problem/1197
MST 기본 문제 (크루스칼 사용함)
가중치 오름차순 정렬된 edges를 순회하며, V-1개의 간선을 만들면 종료한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Main {
static class Edge implements Comparable<Edge> {
int f, t, v;
Edge(int f, int t, int v) {
this.f = f;
this.t = t;
this.v = v;
}
@Override
public int compareTo(Edge o) {
return this.v - o.v;
}
}
static int[] p;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int ans = 0;
int e = 0;
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
p = new int[V + 1];
for (int i = 1; i <= V; i++) {
p[i] = i;
}
List<Edge> edges = new ArrayList<>();
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
edges.add(new Edge(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken())));
}
Collections.sort(edges);
for (Edge edge : edges) {
if (find(edge.f) == find(edge.t)) {
continue;
}
union(edge.f, edge.t);
ans += edge.v;
e++;
if (e == V - 1) {
System.out.println(ans);
return;
}
}
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if (a < b) {
p[b] = a;
} else {
p[a] = b;
}
}
private static int find(int a) {
if (p[a] == a) {
return a;
}
return p[a] = find(p[a]);
}
}
'[백준] PS > Java' 카테고리의 다른 글
[백준 1743] 음식물 피하기 - JAVA (1) | 2025.02.20 |
---|---|
[백준 1460] 진욱이의 농장 - JAVA (0) | 2025.02.17 |
[백준 24391] 귀찮은 해강이 - JAVA (0) | 2025.02.16 |
[백준 1887] Cow Pizza - JAVA (0) | 2025.02.15 |
[백준 1361] 두 스트링 마스크 - JAVA (0) | 2025.02.15 |