알고리즘/SW Expert

1251 하나로

김어찐 2021. 8. 25. 15:42
728x90
import java.io.BufferedReader;
import java.io.FileInputStream;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class algo_1251_김어진 {

	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine()," ");
		int T;
		T=Integer.parseInt(st.nextToken());


		for(int test_case = 1; test_case <= T; test_case++)
		{
			double answer = 0;
			st = new StringTokenizer(br.readLine()," ");
			int N=Integer.parseInt(st.nextToken());
			double xPos[] = new double[N];
			double yPos[] = new double[N];
			int[] parent = new int[N];
			for (int i = 0; i < N; i++) {
				parent[i] = i;
			}
			st = new StringTokenizer(br.readLine()," ");
			for (int i = 0; i < N; i++) {
				xPos[i]=Double.parseDouble(st.nextToken());
			}
			
			st = new StringTokenizer(br.readLine()," ");
			for (int i = 0; i < N; i++) {
				yPos[i]=Double.parseDouble(st.nextToken());
			}
			st = new StringTokenizer(br.readLine()," ");
			double E= Double.parseDouble(st.nextToken());
			
			
			ArrayList<Edge> list = new ArrayList<>();
			for (int i = 0; i < N-1; i++) {
				for (int j = i+1; j < N; j++) {
					double diffX=Math.abs(xPos[i]-xPos[j]);
					double diffY=Math.abs(yPos[i]-yPos[j]);
					double w =  Math.sqrt((diffX*diffX) + (diffY*diffY));
					list.add(new Edge(i,j,w));
				}
			}
			Collections.sort(list);
			int count=0;
			for (Edge edge : list) {
				if (count==N-1) {
					break;
				}
				int a = findParent(parent,edge.start);
				int b = findParent(parent,edge.end);
				if(a!=b) {
					unionParent(parent,a,b);
					answer+=edge.w*edge.w;
					count++;
				}
			}
			
			System.out.printf("#%d %.0f\n",test_case,answer*E);
			
		}

	}

	private static void unionParent(int[] parent, int a, int b) {
		if(a<b)parent[b]=a;
		else parent[a]=b;
	}

	private static int findParent(int[] parent, int x) {
		if(parent[x]!=x) parent[x] = findParent(parent, parent[x]);
		return parent[x];
	}
	

}
class Edge implements Comparable<Edge>{


	int start;
	int end;
	double w;
	
	public Edge(int start, int end, double w) {
		super();
		this.start = start;
		this.end = end;
		this.w = w;
	}

	
	@Override
	public int compareTo(Edge o) {
		// TODO Auto-generated method stub
		if(this.w > o.w) return 1;
		else if(this.w == o.w) return 0;
		else return-1;
	}
}
728x90