[백준] 1197 최소 스패닝 트리
문제보기
최소스패닝트리.. 많이 들어보긴 했는데 실제 문제를 풀어본건 처음이다.
늘 얄팍하게만 공부한 탓이다 ㅠ
어쨋든.. 최소스패닝트리란건, 그래프에서 모든 노드를 방문하되 최소비용으로 방문하는것을 말한다.
크루스칼 알고리즘을 알고있다면 쉽게 풀 수 있다. 그리고 크루스칼 알고리즘을 배우기 전에 유니온파인드를 배우면 좋다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
class Edge implements Comparable<Edge>{
int s;
int e;
int v;
Edge(int s, int e, int v){
this.s = s;
this.e = e;
this.v = v;
}
@Override
public int compareTo(Edge o) {
return this.v - o.v;
}
}
public class Main {
static int ip(String s){return Integer.parseInt(s);};
static int[] roots;
static boolean hasCircle(int s, int e){
int sr = getRoot(s);
int er = getRoot(e);
if(sr == er) return true;
else return false;
}
static int getRoot(int v){
if(roots[v] == v ) return v;
return roots[v] = getRoot(roots[v]);
}
static void connect(int s, int e){
int sr = getRoot(s);
int er = getRoot(e);
if(sr < er) roots[er] = sr;
else roots[sr] = er;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int v = ip(st.nextToken());
int e = ip(st.nextToken());
List<Edge> list = new ArrayList<>();
for(int i = 0 ; i < e ; i++){
st = new StringTokenizer(br.readLine());
int start = ip(st.nextToken());
int end = ip(st.nextToken());
int value = ip(st.nextToken());
list.add(new Edge(start, end, value));
}
roots = new int[v+1];
for(int i = 0 ; i <= v ; i++){
roots[i] = i;
}
Collections.sort(list);
int size = list.size();
int sum = 0;
int cnt = 0;
for(int i = 0 ; i < size ; i++){
if(cnt == v-1) break;
Edge edge = list.get(i);
int start = edge.s;
int end = edge.e;
int value = edge.v;
if(!hasCircle(start, end)){
connect(start, end);
sum += value;
cnt++;
}
}
System.out.println(sum);
}
}
Comments