크루스칼에서
find()
를 수행하며parent
에 넣어주면 더 빠르다.
parent
(이어져 있는지 확인)list
에 추가한다.Edge
의 compareTo
를 오버라이딩 하고 낮은 비용 순으로 정렬 한다.union()
한다.find()
한다. 이 때 find()
를 수행하며 parent
를 저장하면 하나씩 저장하는 것보다 더 빠르다.ct
== V
- 2 까지)public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int V = Integer.parseInt(line[0]);
parent = new int[V + 1];
List<Edge> list = new ArrayList<>();
int E = Integer.parseInt(line[1]);
for (int i = 0; i < E; i++) {
line = br.readLine().split(" ");
int v1 = Integer.parseInt(line[0]);
int v2 = Integer.parseInt(line[1]);
int cost = Integer.parseInt(line[2]);
list.add(new Edge(v1, v2, cost));
}
Collections.sort(list);
int result = 0;
int ct = 0;
for (int i = 0; i < list.size(); i++) {
Edge edge = list.get(i);
if (union(edge.v1, edge.v2)) {
result += edge.cost;
if (++ct == V - 2) {
break;
}
}
}
System.out.println(result);
}
static int find(int v) {
if (parent[v] == 0) {
return v;
}
return parent[v] = find(parent[v]);
}
static boolean union(int v1, int v2) {
int r1 = find(v1);
int r2 = find(v2);
if (r1 == r2) {
return false;
}
parent[r2] = r1;
return true;
}
}
class Edge implements Comparable<Edge> {
int v1;
int v2;
int cost;
public Edge(int v1, int v2, int cost) {
this.v1 = v1;
this.v2 = v2;
this.cost = cost;
}
@Override
public int compareTo(Edge o) {
return this.cost - o.cost;
}
}