https://www.acmicpc.net/problem/6497
크루스칼을 통해 풀이할 수 있는 간단한 문제였다.
문제에서 요구하는 것은 주어진 간선중 MST를 형성하는 간선을 제외한
나머지 간선들의 비용 합이기 때문에, 전체 간선들의 비용합에서 크루스칼 로직을
실행하며 MST를 형성하는 간선들의 비용합을 구한 후 두 값의 차이를 계산하여
답을 구했다.
로직의 시간복잡도는 크루스칼의 으로 수렴하고 이는 인
최악의 경우에도 무난히 문제의 제한 조건인 1초를 통과할 수 있다.
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;
import static java.lang.Integer.*;
public class Main {
static int[] parent;
static PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingInt(edge -> edge.w));
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n, m;
int u, v, w;
int costSum;
StringBuilder sb = new StringBuilder();
while (true) {
st = new StringTokenizer(br.readLine());
m = parseInt(st.nextToken());
n = parseInt(st.nextToken());
if (m == 0 && n == 0) break;
parent = new int[m];
costSum = 0;
while (n-- > 0) {
st = new StringTokenizer(br.readLine());
u = parseInt(st.nextToken());
v = parseInt(st.nextToken());
w = parseInt(st.nextToken());
pq.offer(new Edge(u, v, w));
costSum += w;
}
sb.append(kruskal(m, costSum)).append("\n");
pq.clear();
}
System.out.print(sb);
br.close();
}
static int find(int u) {
if (parent[u] < 0) return u;
return parent[u] = find(parent[u]);
}
static int kruskal(int m, int costSum) {
Arrays.fill(parent, -1);
int selectedEdges = 0;
while (selectedEdges < m - 1) {
Edge e = pq.poll();
int r1 = find(e.u);
int r2 = find(e.v);
if (r1 == r2) continue;
if (parent[r1] < parent[r2]) {
parent[r1] += parent[r2];
parent[r2] = r1;
} else {
parent[r2] += parent[r1];
parent[r1] = r2;
}
costSum -= e.w;
selectedEdges++;
}
return costSum;
}
static class Edge {
int u, v, w;
public Edge(int u, int v, int w) {
this.u = u;
this.v = v;
this.w = w;
}
}
}