https://www.acmicpc.net/problem/1197
Edge
클래스 정의parent
배열 선언, V
크기로 초기화parent
배열은 음수일 때 랭크, 양수일 때 부모 정점 번호 의미V-1
개의 간선 채택find
연산을 통해 연결된 두 정점의 루트 정점 탐색union
연산 수행하며 간선 채택import static java.lang.Integer.parseInt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = parseInt(st.nextToken());
int E = parseInt(st.nextToken());
parent = new int[V];
Arrays.fill(parent, -1);
PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingLong(e -> e.w));
while (E-- > 0) {
st = new StringTokenizer(br.readLine());
int u = parseInt(st.nextToken()) - 1;
int v = parseInt(st.nextToken()) - 1;
int w = parseInt(st.nextToken());
pq.offer(new Edge(u, v, w));
}
int count = 0;
int sum = 0;
while (count < V - 1) {
Edge e = pq.poll();
int u = find(e.u);
int v = find(e.v);
if (u == v) {
continue;
}
if (parent[u] < parent[v]) {
parent[u] += parent[v];
parent[v] = u;
} else {
parent[v] += parent[u];
parent[u] = v;
}
count++;
sum += e.w;
}
System.out.println(sum);
br.close();
}
static int find(int u) {
if (parent[u] < 0) {
return u;
}
return parent[u] = find(parent[u]);
}
static class Edge {
int u, v, w;
public Edge(int u, int v, int w) {
this.u = u;
this.v = v;
this.w = w;
}
}
}