Algorithm
[Algo] 백준 16398 행성 연결 JAVA
조핑구
2024. 5. 8. 13:59
문제 바로가기 : https://www.acmicpc.net/problem/16398
메모리 : 139400KB
시간 : 1156ms
언어 : Java 11
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static class Node implements Comparable<Node> {
int a, b, cost;
Node(int a, int b, int cost) {
this.a = a;
this.b = b;
this.cost = cost;
}
@Override
public int compareTo(Node o) {
return this.cost - o.cost;
}
}
static PriorityQueue<Node> pq = new PriorityQueue<>();
static long mini;
static int[] parent;
static int N;
public static <T> void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st;
mini = 0;
parent = new int[N];
for (int i = 0; i < N; i++) {
parent[i] = i;
}
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
int c = Integer.parseInt(st.nextToken());
pq.add(new Node(i, j, c));
}
}
kruskal();
System.out.print(mini);
}
private static void kruskal() {
int cnt = 0;
while (!pq.isEmpty()) {
Node n = pq.poll();
if (find(n.a) != find(n.b)) {
union(n.a, n.b);
mini += n.cost;
cnt++;
}
if (cnt == N - 1)
break;
}
}
private static void union(int a, int b) {
int x = find(a);
int y = find(b);
if (x <= y) {
parent[y] = x;
} else if (x > y) {
parent[x] = y;
}
}
private static int find(int num) {
if (parent[num] == num) {
return num;
} else {
return parent[num] = find(parent[num]);
}
}
}
크루스칼을 연습하기 위한 문제! 도시건설과 비슷하다.