알고리즘
백준 1197번 최소 스패닝 트리 (JAVA)
박카스마시며코딩
2024. 1. 7. 22:27
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
저는 크루스칼을 통해 문제를 해결하였습니다.
(정점의 개수)^2 보다 간선의 개수 작기 때문에 크루스칼이 더 유리하다 판단하여 크루스칼을 통해 문제를 해결하였습니다. 크루스칼의 경우 Elog(E)의 시간복잡도를 갖아 더 유리하여 이를 활용하여 문제를 풀었습니다.
package BOJ.mst;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_1197_4 {
private static class Edge {
int start;
int end;
int weight;
public Edge(int start, int end, int weight) {
this.start = start;
this.end = end;
this.weight = weight;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
List<Edge> edges = new ArrayList<>();
for (int i = 0 ; i < m ; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
edges.add(new Edge(start, end, weight));
}
Collections.sort(edges, (v1, v2) -> {
return v1.weight - v2.weight;
});
int result = cal(edges, n, m);
System.out.println(result);
}
private static int findSet(int now, int[] parent) {
if (now == parent[now]) {
return now;
}
return parent[now] = findSet(parent[now], parent);
}
private static boolean union(int a, int b, int[] parent) {
int aParent = findSet(a, parent);
int bParent = findSet(b, parent);
if (aParent == bParent) {
return false;
} else {
parent[aParent] = bParent;
return true;
}
}
private static int cal(List<Edge> edges, int n, int m) {
int[] parent = new int[n+1];
for (int i = 0; i <= n; i++) {
parent[i] = i;
}
int result = 0;
for (int i = 0; i < m ; i++) {
Edge edge = edges.get(i);
if (union(edge.start, edge.end, parent)) {
result += edge.weight;
}
}
return result;
}
}