알고리즘
[백준/자바] #1197
룰루루
2025. 6. 15. 11:43
최소 신장 트리(MST, minimum spanning tree)를 찾는 알고리즘에는 Prim 알고리즘과 Kruskal 알고리즘이 있다고 알고 있는데, 나는 Kruskal 알고리즘을 이용해서 풀었다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
class Main {
static class Edge implements Comparable<Edge> {
int u;
int v;
int wt;
public Edge(int u, int v, int wt) {
this.u = u;
this.v = v;
this.wt = wt;
}
@Override
public int compareTo(Main.Edge o) {
if (this.wt < o.wt) {
return -1;
} else if (this.wt > o.wt) {
return 1;
}
if (this.u < o.u) {
return -1;
} else if (this.u > o.u) {
return 1;
}
if (this.v < o.v) {
return -1;
} else if (this.v > o.v) {
return 1;
}
return 0;
}
}
static int V;
static int E;
static Edge[] edges;
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input1 = br.readLine().split(" ");
V = Integer.parseInt(input1[0]);
E = Integer.parseInt(input1[1]);
edges = new Edge[E];
parent = new int[V+1];
for(int i=0; i<V+1; i++) {
parent[i] = i;
}
for(int i=0; i<E; i++) {
String[] input2 = br.readLine().split(" ");
int u = Integer.parseInt(input2[0]);
int v = Integer.parseInt(input2[1]);
int wt = Integer.parseInt(input2[2]);
edges[i] = new Edge(u, v, wt);
}
br.close();
Arrays.sort(edges);
long answer = findWeight();
bw.write(String.valueOf(answer) + "\n");
bw.flush();
bw.close();
}
private static int findParent(int currentNode) {
if (currentNode == parent[currentNode]) {
return currentNode;
}
parent[currentNode] = findParent(parent[currentNode]);
return parent[currentNode];
}
private static void union(int nodeA, int nodeB) {
int parentA = findParent(nodeA);
int parentB = findParent(nodeB);
if (parentA < parentB) {
parent[parentB] = parentA;
} else {
parent[parentA] = parentB;
}
}
private static long findWeight() {
long totalWeight = 0L;
for (Edge edge : edges) {
int uParent = findParent(edge.u);
int vParent = findParent(edge.v);
if (uParent != vParent) {
union(edge.u, edge.v);
totalWeight += (long) edge.wt;
}
}
return totalWeight;
}
}