알고리즘/백준
백준 4386 별자리 만들기 Java [최소스패닝트리, 프림]
쫑쫑2
2022. 11. 10. 00:21
https://www.acmicpc.net/problem/4386
4386번: 별자리 만들기
도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일
www.acmicpc.net
최소 스패닝 트리 문제이다
아무 생각없이 프림을 사용해서 풀었는데 풀고보니 크루스칼으로 푸는게 좋아보인다
N x N 행렬을 만들고 피타고라스의 정의 a^2 + b^2 = c^2를 활용해 두 변 사이의 거리를 구해 넣어줬다
우선순위큐에서 거리를 기준으로 최소값을 꺼내 방문 하지 않은 노드들을 방문해가면서 결과값에 더해줬다
출력은 10^-2까지만 구하면 된다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int cnt = N;
double result = 0;
StringTokenizer st;
double[][] stars = new double[N][2];
double[][] dist = new double[N][N];
boolean[] vtd = new boolean[N];
for (int n = 0; n < N; n++) {
st = new StringTokenizer(br.readLine());
stars[n][0] = Double.parseDouble(st.nextToken());
stars[n][1] = Double.parseDouble(st.nextToken());
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) continue;
double len = Math.sqrt(Math.pow(stars[i][0] - stars[j][0], 2)
+ Math.pow(stars[i][1] - stars[j][1], 2));
dist[i][j] = len;
dist[j][i] = len;
}
}
PriorityQueue<double[]> queue = new PriorityQueue<>((a,b) -> (int) (a[0] - b[0]));
queue.add(new double[]{0, 0});
while (!queue.isEmpty() && cnt > 0) {
double[] now = queue.poll();
int n = (int) now[1];
if (vtd[n]) continue;
vtd[n] = true;
cnt--;
result += now[0];
for (int i = 0; i < N; i++) {
if (vtd[i]) continue;
queue.add(new double[]{dist[n][i], i});
}
}
System.out.printf("%.2f", result);
}
}