Algorithm
Kruska Algorithm
정의
탐욕적인 방법(Greedy Method)을 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 것
개념
MST(최소 신장 트리)가
- 최소 비용의 간선으로 구성됨
- 사이클을 포함하지 않음
의 조건에 근거하여 각 단계에서 사이클을 이루지 않는 최소 비용 간선을 선택한다.
구현
- 처음에 모든 간선을 가중치에 따라 오름차순으로 정렬
- 가중치가 가장 낮은 간선부터 선택하면서 트리를 증가시킴
- 사이클이 존재하면, 남아 있는 간선 중 그 다음으로 가중치가 낮은 간선 선택
- n - 1개의 간선이 선택될 때까지 2를 반복
코드
package org.example.tree.spanningtree; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; class Edge { int from; int to; int weight; public Edge(int from, int to, int weight) { this.from = from; this.to = to; this.weight = weight; } } public class MinimumSpanningTree { private static int V, E; static Edge[] edgeList; private static int[] parents; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); V = Integer.parseInt(st.nextToken()); E = Integer.parseInt(st.nextToken()); edgeList = new Edge[E]; for (int i = 0; i < E; i++) { st = new StringTokenizer(br.readLine()); int from = Integer.parseInt(st.nextToken()); int to = Integer.parseInt(st.nextToken()); int weight = Integer.parseInt(st.nextToken()); edgeList[i] = new Edge(from, to, weight); } // 간선 리스트를 가중치 기준으로 오름차순 정렬 Arrays.sort(edgeList); // V개의 정점으로 make set 작업 make(); int result = 0; int count = 0; for (Edge edge : edgeList) { if (union(edge.from, edge.to)) { result += edge.weight; if (++count == V - 1) { break; } } } System.out.println(result); } private static void make() { parents = new int[V]; for (int i = 0; i < V; i++) { parents[i] = i; } } private static int find(int target) { if (parents[target] == target) { return target; } return parents[target] = find(parents[target]); } private static boolean union(int a, int b) { int aRoot = find(a); int bRoot = find(b); if (aRoot == bRoot) { return false; } parents[bRoot] = aRoot; return true; } }