[백준] 1197번 - 최소 스패닝 트리 (Gold 4)
업데이트:
문제 링크
문제 설명
주어진 그래프의 최소 신장 트리의 가중치를 구하는 프로그램을 작성하시오.
최소 신장 트리란 주어진 그래프의 모든 정점을 연결하는 부분 그래프 중 가중치의 합이 최소인 트리이다.
정답 코드 및 설명
백준 1647번 - 도시 분할 계획 (Gold 4)에서 간략하게 설명했듯이, 최소 신장 트리를 구하는 알고리즘은 프림 알고리즘과 크루스칼 알고리즘 두 가지가 대표적으로 알려져 있다.
앞의 문제의 풀이에서 크루스칼 알고리즘을 사용하였으므로, 이 문제는 프림 알고리즘을 사용한 코드를 첨부하였다. 물론 이 문제를 크루스칼 알고리즘으로 풀어도 상관없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BOJ1197 {
int v;
ArrayList<Edge>[] adj;
static class Edge implements Comparable<Edge> {
int end, weight;
Edge(int end, int weight) {
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
if (this.weight > o.weight) return 1;
if (this.weight < o.weight) return -1;
return this.end - o.end;
}
}
void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
v = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
adj = new ArrayList[v];
for (int i = 0; i < v; i++) {
adj[i] = new ArrayList<>();
}
while (e-- > 0) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken()) - 1;
int end = Integer.parseInt(st.nextToken()) - 1;
int weight = Integer.parseInt(st.nextToken());
adj[start].add(new Edge(end, weight));
adj[end].add(new Edge(start, weight));
}
}
int Prim() {
int totalWeight = 0;
boolean[] isSelected = new boolean[v];
PriorityQueue<Edge> pq = new PriorityQueue<>();
pq.add(new Edge(0, 0));
while (!pq.isEmpty()) {
Edge currEdge = pq.poll();
int curr = currEdge.end;
if (isSelected[curr]) continue;
isSelected[curr] = true;
totalWeight += currEdge.weight;
for (Edge e : adj[curr]) {
if (isSelected[e.end]) continue;
pq.add(e);
}
}
return totalWeight;
}
void solution() throws IOException {
input();
System.out.println(Prim());
}
public static void main(String[] args) throws IOException {
new BOJ1197().solution();
}
}
댓글남기기