18분
Edge[] edges = new Edge[M];
// ... 간선 입력 ...
Arrays.sort(edges);
parent = new int[N + 1];
for (int i = 0; i <= N; i++) parent[i] = i;
for (Edge edge : edges) {
int rootA = UnionFind(edge.A);
int rootB = UnionFind(edge.B);
if (rootA == rootB) continue; // 사이클 발생
parent[rootA] = rootB;
sum += edge.C;
maxC = Math.max(maxC, edge.C); // 가장 큰 가중치 기록
cnt++;
if (cnt == N - 1) break; // MST 완성
}
static int UnionFind(int x) {
if (parent[x] == x) return x;
return parent[x] = UnionFind(parent[x]); // 경로 압축
}
System.out.println(sum - maxC);