Minimal Spanning Tree,
신장 트리는 그래프에서 모든 정점에 대한 최소한의 연결만을 남긴 그래프이다. 최소 비용 신장 트리는 신장 트리들 중 간선의 가중치 합이 가장 작은 트리이다.
즉. 그래프의 모든 노드를 사이클 없이 모두 연결할때, 최소 비용을 가지는 것.
따라서 MST의 비용은 45가 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Main {
static class Node implements Comparable<Node> {
int start;
int end;
int value;
Node(int a, int b, int c) {
start = a;
end = b;
value = c;
}
public int compareTo(Node n) {
return value - n.value;
}
}
static int parent[];
static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] splitedLine = in.readLine().split(" ");
N = Integer.parseInt(splitedLine[0]);
M = Integer.parseInt(splitedLine[1]);
init();
PriorityQueue<Node> pq = new PriorityQueue<>();
for (int i = 0; i < M; ++i) {
splitedLine = in.readLine().split(" ");
pq.add(new Node(Integer.parseInt(splitedLine[0]), Integer.parseInt(splitedLine[1]),
Integer.parseInt(splitedLine[2])));
}
int value = 0;
while (!pq.isEmpty()) {
Node node = pq.poll();
if (find(node.start) != find(node.end)) {
union(node.start, node.end);
value += node.value;
}
}
System.out.println(value);
}
public static void init() {
parent = new int[N];
for (int i = 0; i < N; ++i) {
parent[i] = i;
}
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a < b)
parent[b] = a;
else
parent[a] = b;
}
private static int find(int n) {
if (n == parent[n])
return n;
else
return parent[n] = find(parent[n]);
}
}
// 작성중..