[1197 최소 스패닝 트리]
난이도: 골드4
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
문제
입력
출력
[아이디어]
최소 스패닝 트리는 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 최소의 가중치 합을 가지는 그래프이다.
MST 는 간적크, 간만프 -> 간선이 적으면 크루스칼, 간선이 많으면 크프림 알고리즘을 적용하는게 기본이지만 절대적이지는 않다.
하지만 나는 union, find를 활용하였다.
[JAVA 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokens;
static int V, E;
static int [] p;
static PriorityQueue<Edge> pQ = new PriorityQueue<>((e1, e2) -> Long.compare(e1.weight, e2.weight));
static class Edge {
int node1, node2;
long weight;
public Edge(int n1, int n2, long w) {
this.node1 = n1;
this.node2 = n2;
this.weight = w;
}
}
public static void main(String[] args) throws IOException {
tokens = new StringTokenizer(br.readLine());
V = Integer.parseInt(tokens.nextToken());
E = Integer.parseInt(tokens.nextToken());
for(int i= 0; i < E; i++) {
tokens = new StringTokenizer(br.readLine());
int n1 = Integer.parseInt(tokens.nextToken());
int n2 = Integer.parseInt(tokens.nextToken());
long w = Long.parseLong(tokens.nextToken());
pQ.offer(new Edge(n1, n2, w));
}
makeSet();
int cnt = 0;
long total = 0;
while(cnt < V - 1) {
Edge edge = pQ.poll();
if(union(edge.node1, edge.node2)) {
cnt++;
total += edge.weight;
}
}
System.out.println(total);
}
private static void makeSet() {
p = new int [V + 1];
for(int i = 1; i <= V; i++) {
p[i] = i;
}
}
private static int find(int node) {
if(node == p[node]) return node;
else return p[node] = find(p[node]);
}
private static boolean union(int node1, int node2) {
int p1 = find(node1), p2 = find(node2);
if(p1 == p2) return false;
p[p1] = p2;
return true;
}
}
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 14500 테트로미노 (Java) (1) | 2022.03.30 |
---|---|
[백준] 11727 2xn 타일링2 (Java) (0) | 2022.03.25 |
[백준] 11726 2xn 타일링 (Java) (0) | 2022.03.25 |
[백준] 1647 도시 분할 계획 (Java) (0) | 2022.03.10 |
[백준] 1202 유기농 배추 (Java) (0) | 2022.03.03 |
댓글