Lewis's Tech Keep
[BOJ][6497] 전력난 - JAVA 본문
참고 : https://www.acmicpc.net/submit/6497
참고 풀이 링크 : https://steady-coding.tistory.com/118
- 크루스칼 알고리즘 사용하는 문제
- 크루스칼은 개념적으로만 알고 있었고 union-find 의 개념을 몰랐다.
- Minimum Spanning Tree 공부 좀 더 해야 할 듯 하다.
- 모든 노드를 연결하면서 최소한의 비용을 가지는 tree를 만들어야 함. (모든 노드가 연결 = 모든 길의 전신주에 불이 들어 옴)
더보기
import java.util.*;
class Solution {
static int[] parent;
static ArrayList<Edge> edges;
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) {
Scanner sc = new Scanner(System.in);
while (true) {
int m = sc.nextInt();
int n = sc.nextInt();
if (m == 0 && n == 0) {
break;
}
edges = new ArrayList<Edge>();
int totalCost = 0;
for (int i = 0; i < n; i++) {
int e1 = sc.nextInt();
int e2 = sc.nextInt();
int weight = sc.nextInt();
edges.add(new Edge(e1, e2, weight));
totalCost += weight;
}
edges.sort(Comparator.comparingInt(a -> a.weight));
parent = new int[m];
for (int i = 0; i < m; i++) {
parent[i] = i;
}
int minCost = 0;
for (int i = 0; i < edges.size(); i++) {
Edge e = edges.get(i);
if (find(e.start) != find(e.end)) {
minCost += e.weight;
union(e.start, e.end);
}
}
System.out.println(totalCost - minCost);
}
}
private static int find(int a) {
if (a == parent[a]) {
return a;
}
return parent[a] = find(parent[a]);
}
private static void union(int a, int b) {
a = find(a);
b = find(b);
if (parent[a] != parent[b]) {
parent[b] = a;
}
}
}
'Java > 알고리즘' 카테고리의 다른 글
[프로그래머스] 보석 쇼핑 (0) | 2021.06.18 |
---|---|
[BOJ][20440] 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 - JAVA (0) | 2021.06.15 |
[프로그래머스] 다단계 칫솔 판매 (0) | 2021.06.12 |
[BOJ][20300] 서강근육맨 - JAVA (0) | 2021.06.11 |
[백준] 분해합 (0) | 2021.06.08 |
Comments