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 76 77 78 79 80 81 82 83 84 85 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class MST1_KruskalTest { static class Edge implements Comparable<Edge> { int from, to, weight; public Edge(int from, int to, int weight) { super(); this.from = from; this.to = to; this.weight = weight; } @Override public int compareTo(Edge o) { return this.weight - o.weight; } } static int N; static int[] parents; static Edge[] edgeList; // 단위집합 생성 static void makeSet() { parents = new int[N]; // 자신의 부모노드를 자신의 값으로 세팅 for (int i = 0; i < N; i++) parents[i] = i; } // a의 집합 찾기 : a의 대표자 찾기 static int findSet(int a) { if (a == parents[a]) return a; // 내 부모를 찾고 찾아온 부모로 갱신 return parents[a] = findSet(parents[a]); // path compression } static boolean union(int a, int b) { int aRoot = findSet(a); int bRoot = findSet(b); if (aRoot == bRoot) return false; parents[bRoot] = aRoot; return true; } public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); int 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); // 간선비용 오름차순 정렬 makeSet(); int cnt = 0; int result = 0; for (Edge edge : edgeList) { if (union(edge.from, edge.to)) { cnt++; result += edge.weight; } if (cnt == N - 1) break; } System.out.println(result); } } | cs |
'Algorithm' 카테고리의 다른 글
다익스트라 알고리즘 (0) | 2022.04.01 |
---|---|
프림 알고리즘 (0) | 2022.03.17 |
Union & Find 알고리즘 (0) | 2022.03.17 |
KMP(Knuth-Morris-Pratt) 알고리즘 (0) | 2022.03.10 |
네트워크 플로우(Network Flow) 및 이분 매칭(Bipartite Matching) (0) | 2022.03.07 |