알고리즘/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