SSONG Cloud

[백준] 4386 별자리 만들기 본문

Algorithm/백준

[백준] 4386 별자리 만들기

SSONGMI 2021. 3. 28. 22:57
반응형

문제 출처: www.acmicpc.net/problem/4386

 

4386번: 별자리 만들기

도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일

www.acmicpc.net

: 널브러져 있는 별들을 이어 별자리를 만들어야 한다.

: 모든 별들을 이어야 하고, 잇는 방법중 최소 비용으로 이을 수 있도록 해야한다.

: 프림 알고리즘을 통해 최소 신장트리를 만들어 최소 비용을 구할 수 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static class Point{
		double r, c;

		public Point(double r, double c) {
			super();
			this.r = r;
			this.c = c;
		}
		
	}
	public static void main(String[] args) throws NumberFormatException, IOException {
		int N = Integer.parseInt(br.readLine());
		
		Point[] p = new Point[N];
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			double r = Double.parseDouble(st.nextToken());
			double c = Double.parseDouble(st.nextToken());
			
			p[i] = new Point(r, c);
		}
		double[][] adj = new double[N][N];
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				if(i == j) continue;
				double dr = p[i].r - p[j].r;
				double dc = p[i].c - p[j].c;
				adj[i][j] = Math.sqrt(dr*dr + dc*dc);
			}
		}
//		for(double[] sub : adj)
//			System.out.println(Arrays.toString(sub));
		boolean[] v = new boolean[N];
		double[] minEdge = new double[N];
		double res = 0;
		Arrays.fill(minEdge, Double.MAX_VALUE);
		minEdge[0] = 0;
		for(int i = 0; i < N; i++) {
			double min = Double.MAX_VALUE;
			int minV = 0;
			for(int j = 0; j < N; j++) {
				if(!v[j] && min > minEdge[j]) {
					min = minEdge[j];
					minV = j;
				}
			}
			
			v[minV] = true;
			res += minEdge[minV];
			
			for(int j = 0; j < N; j++) {
				if(!v[j] && adj[minV][j] != 0 && minEdge[j] > adj[minV][j]) {
					minEdge[j] = adj[minV][j];					
				}
			}
		}
//		System.out.println(Arrays.toString(minEdge));
		System.out.println(String.format("%.2f", res));
		
	}
}

www.acmicpc.net/problem/4386

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 16236 아기 상어  (0) 2021.03.28
[백준] 20040 사이클 게임  (0) 2021.03.28
[백준] 2644 촌수계산  (0) 2021.03.27
[백준] 9205 맥주 마시면서 걸어가기  (0) 2021.03.27
[백준] 14502 연구소  (0) 2021.03.26
Comments