코딩

알고스팟 자바(java) 해답 : LAN

King Attila 2021. 5. 14. 07:48
728x90
import java.util.*;

public class Main{
	
	static int test = 0;
	
	static int[] building;
	
	static int[] x;
	
	static int[] y;
	
	static double[][] map;
	
	static int[] visit;
	
	public static void main(String args[]) throws Exception {
		
		building = new int[501];
		
		visit = new int[501];
		
		x = new int[501];
		
		y = new int[501];
		
		map = new double[501][501];
		
		Scanner scanner = new Scanner(System.in);
		
		test = scanner.nextInt();
		
		int M,N;
		
		int a,b;
		
		for(int i = 0; i < test; i++){
			double result = 0;
			for(int j = 0; j < map.length; j++)
				Arrays.fill(map[j], 1);
			N = scanner.nextInt();
			M = scanner.nextInt();
			for(int j = 0; j < N; j++)
				x[j] = scanner.nextInt();
			for(int j = 0; j < N; j++)
				y[j] = scanner.nextInt();
			for(int j = 0; j < M; j++){
				a = scanner.nextInt();
				b = scanner.nextInt();
				map[a][b] = 0;
				map[b][a] = 0;
			}
			distance(N);
			result = prem(N);
			System.out.println(result);
		}
    }
	static void distance(int N){
		
		double value;
		
		for(int i = 0; i < N-1; i++)
			for(int j = i+1; j < N; j++){
				if(map[i][j] != 0){
					value = Math.sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
					map[i][j] = value;
					map[j][i] = value;
				}
			}
		
	}
	static double prem(int N){
		double sum = 0;
		int [] visit;
		double [] length;
		visit = new int[501];
		length = new double[501];
		Arrays.fill(visit, 0);
		Arrays.fill(length, 0x7fffffff);
		length[0] = 0;
		for(int i = 0; i < N; i++){
			int now = 0;
			double nowd = 0x7fffffff;
			for(int j = 0; j < N; j++){
				if(length[j] < nowd && visit[j] == 0){
					now = j;
					nowd = length[j];
				}
			}
			if(nowd == 0x7fffffff)
				break;
			visit[now] = 1;
			sum += nowd;
			
			for(int j = 0; j < N; j++){
				if(map[now][j] < length[j]){
					length[j] = map[now][j];
				}
			}
		}
		return sum;
	}
}
728x90