1. 유형
MST
2. 문제 분석
2-1. 해설
크루스 칼 알고리즘을 여러 번 사용해서 푸는 문제입니다.
크루스 칼을 한번 돌리고, 가중치가 가장 작은 선분을 하나 빼고, 다시 크루스 칼 돌리고...
이걸 반복해주면 끝나는 문제였습니다.
2-2. 설계
3. 코드
부노노드가 전부 같은지 확인하는 코드
부모 노드가 같지 않으면 union을 사용해서 부모 노드 동일하게 만들어줌
import java.io.*;
import java.util.*;
public class Main {
static int N, M, K, parent[];
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
List<int[]> list = new ArrayList<>();
N = stoi(st.nextToken());
M = stoi(st.nextToken());
K = stoi(st.nextToken());
parent = new int[N + 1];
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(in.readLine());
int a = stoi(st.nextToken());
int b = stoi(st.nextToken());
list.add(new int[] { a, b, i });
}
Collections.sort(list, (a, b) -> (a[2] - b[2]));
int start = 0;
int ans[] = new int[K];
while (start < K) {
Queue<int[]> pq = new PriorityQueue<>((a, b) -> (a[2] - b[2]));
init();
for (int i = start; i < M; i++) {
int cur[] = list.get(i);
pq.add(cur);
}
int total = 0;
while (!pq.isEmpty()) {
int cur[] = pq.poll();
if (find(cur[0]) != find(cur[1])) {
union(cur[0], cur[1]);
total += cur[2];
}
}
if (check()) {
ans[start] = total;
start++;
} else
break;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < K; i++) {
sb.append(ans[i]).append(" ");
}
System.out.println(sb);
}
static int find(int x) {
if (x == parent[x]) {
return x;
}
return parent[x] = find(parent[x]);
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if (a < b) {
parent[b] = a;
} else {
parent[a] = b;
}
}
static boolean check() {
for (int i = 1; i < N; i++) {
if (find(i) != find(i + 1)) {
return false;
}
}
return true;
}
static void init() {
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
}
static int stoi(String s) {
return Integer.valueOf(s);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 2146 - 다리 만들기 (0) | 2021.09.10 |
---|---|
백준 19542 - 전단지 돌리기 (0) | 2021.09.09 |
백준 - 2406 안정적인 네트워크 (0) | 2021.09.07 |
백준 17090 - 미로 탈출하기 (0) | 2021.09.03 |
백준 1747 - 소수&팰린드롬 (0) | 2021.09.02 |