해결
아이디어 : 크루스칼 알고리즘으로 노드들을 비용이 적은 간선부터 연결을 한다. 이 때, 사이클 발생시에는 간선을 설치를 하지 않는다. 그렇게 진행한다면 모든 노드들이 연결이 되는데 마지막 가장 비용이 큰 노드를 제거하여 그룹을 두개로 나누면 된다.
코드
import java.util.*;
// 도시 분할 계획
public class Practice2 {
public static int[] parent;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
// 부모 리스트 갱신
parent = new int[n+1];
for(int i=1; i<=n; i++){
parent[i] = i;
}
List<List<Integer>> queue = new ArrayList<>();
for(int i=0; i<m; i++){
queue.add(Arrays.asList(sc.nextInt(), sc.nextInt(), sc.nextInt()));
}
// 정렬
Collections.sort(queue, Comparator.comparing(arr -> arr.get(2)));
int result = 0;
int last = 0;
for(List<Integer> info : queue){
int node1 = info.get(0);
int node2 = info.get(1);
int cost = info.get(2);
// 부모 파악
int parent1 = find(node1);
int parent2 = find(node2);
// 사이클 발생시 도로 설치 안함
if(parent1 == parent2){
continue;
}
// 부모 파악 및 합치기 연산
union(node1, node2);
result += cost;
last = cost;
}
System.out.println(result-last);
}
public static int find(int node){
if(parent[node] != node){
parent[node] = find(parent[node]);
}
return parent[node];
}
public static void union(int x, int y){
int parent1 = find(x);
int parent2 = find(y);
parent[parent1] = (parent1 > parent2) ? parent2 : parent1;
parent[parent2] = (parent1 > parent2) ? parent2 : parent1;
}
}
'Algorithm > Practice' 카테고리의 다른 글
이코테 - 탑승구 with JAVA (0) | 2023.10.04 |
---|---|
이코테 - 커리큘럼 with JAVA (0) | 2023.09.27 |
이코테 - 정확한 순위 with JAVA (0) | 2023.09.18 |
이코테 - 편집거리 with JAVA (0) | 2023.09.18 |
이코테 - 못생긴 수 with JAVA (0) | 2023.09.15 |