- 간선 데이터를 비용을 따라 오름차순으로 정렬
- 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인 (이때, 사이클 발생 여부는 유니온파인드를 사용해 판별)
1 – 사이클이 발생하지 않는 경우 최소 신장 트리에 포함
2 – 사이클이 발생하는 경우 최소 신장 트리에 포함시키지 않음- 모든 간선에 대해 2번의 과정을 반복
백준 1197번 최소 스패닝 트리
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BaekJoon1197 {
static int[] parent;
static PriorityQueue<pEdge> queue = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
parent = new int[V + 1];
for (int i = 1; i <= V; i++) {
parent[i] = i;
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
queue.add(new pEdge(s, e, v));
}
int useEdge = 0;
int ans = 0;
while (useEdge < V - 1) {
pEdge cur = queue.poll();
if (find(cur.s) != find(cur.e)) {
ans += cur.v;
useEdge++;
union(cur.s, cur.e);
}
}
System.out.println(ans);
}
// 유니온 파인드
private static int find(int num) {
if (parent[num] == num) {
return num;
} else {
return parent[num] = find(parent[num]);
}
}
private static void union(int num1, int num2) {
int a = find(num1);
int b = find(num2);
if (a != b) {
parent[b] = a;
}
}
static class pEdge implements Comparable<pEdge> {
int s;
int e;
int v;
pEdge(int s, int e, int v) {
this.s = s;
this.e = e;
this.v = v;
}
// 비용 기준 오름차순 정렬
@Override
public int compareTo(pEdge o) {
return this.v - o.v;
}
}
}