알고리즘을 모르는 상태에서 저에게 최소비용으로 길을 연결하라고 하면 다음과 같이 생각할 거 같습니다.
MST의 이론은 위 의식의 흐름과 비슷합니다.
사이클이 발생하지 않는
간선을 비용이 낮은 순서대로 선택합니다.각 노드에 대한 parent배열 생성
PriorityQueue에 데이터 삽입
for(pq에 있는 값을 하나씩 꺼내면서){
if(해당 값이 사이클을 발생시키지 않으면){
MST비용에 추가
}
}
find_parent(x){
if(x의 부모가 x면) return x
if(x의 부모가 x가 아니면) return x의 최고부모 // 재귀적으로 부모의부모, 부모의부모의부모,...를 찾아감
}
union(a,b){
int pa = a의 최고부모
int pb = b의 최고부모
if(pa == pb){ // a의 최고부모와 b의 최고부모가 같으면
return false // 사이클이 발생함
}else{ // 사이클이 발생하지 않음
pa와pb를 연결 // 연결했다는 건 pa의 부모가 pb가 되거나 pb의 부모가 pa가 된다는 의미입니다.
}
}
import java.util.*;
class Main {
static int[] parent;
static int Score = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
parent = new int[N];
for (int i = 0; i < N; i++) {
parent[i] = i;
}
Queue<pos> pq = new PriorityQueue<pos>();
for (int i = 0; i < M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
pq.add(new pos(a - 1, b - 1, c));
}
for (int i = 0; i < M; i++) {
pos link = pq.poll();
if (union(link.a, link.b)) {
Score += link.c;
}
}
System.out.println(Score);
}
public static int find_parent(int x) {
if (x != parent[x]) {
parent[x] = find_parent(parent[x]);
}
return parent[x];
}
public static boolean union(int a, int b) {
int pa = find_parent(a);
int pb = find_parent(b);
if (pa == pb) {
return false;
} else if (pa > pb) {
parent[pa] = pb;
} else {
parent[pb] = pa;
}
return true;
}
static class pos implements Comparable<pos> {
int a;
int b;
int c;
public pos(int a, int b, int c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
@Override
public String toString() {
return "pos [a=" + a + ", b=" + b + ", c=" + c + "]";
}
@Override
public int compareTo(pos o) {
// TODO Auto-generated method stub
return this.c - o.c;
}
}
}