/*UVa 10369 - Arctic Network
* 使用Kruscal算法 求最小生成树
* 将使用到的边排序 排除最大的s-1个 剩下的边中最大的即为所求
* */
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Edge {
int u;// 边的起点
int v;// 边的终点
double w;// 边的权重;
public Edge(int u, int v, double w) {
this.u = u;
this.v = v;
this.w = w;
}
}
class EdgeComparator implements Comparator<Edge> {
@Override
public int compare(Edge o1, Edge o2) {
if (o1.w < o2.w)
return -1;
else if (o1.w > o2.w)
return 1;
return 0;
}
}
class Main {
static final int MAXN = 505;
Edge[] e = new Edge[MAXN * MAXN];
int[] p = new int[MAXN * MAXN];
double[][] w = new double[MAXN][MAXN];
int[] x = new int[MAXN];
int[] y = new int[MAXN];
double[] q = new double[MAXN];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Main mm = new Main();
int count = scanner.nextInt();
while (count > 0) {
count--;
int s = scanner.nextInt();
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
mm.x[i] = scanner.nextInt();
mm.y[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
if (i != j)
mm.w[i][j] = mm.w[j][i] = mm.getLength(i, j);
}
}
int index = 0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
mm.e[index++] = new Edge(i, j, mm.w[i][j]);
}
}
for (int i = 0; i <= n * n; i++) {// 并查集初始化
mm.p[i] = i;
}
Arrays.sort(mm.e, 0, index, new EdgeComparator());// 按边权排序
int pos = 0;
for (int i = 0; i < index; i++) {
int x = mm.find(mm.e[i].u);// 起点
int y = mm.find(mm.e[i].v);// 终点
if (x != y) {// 如果不在同一个集合就合并
mm.p[x] = y;
mm.q[pos++] = mm.e[i].w;
}
}
Arrays.sort(mm.q, 0, pos);
System.out.printf("%.2f\n", mm.q[pos - s]);
}
}
private double getLength(int i, int j) {
double m = Math.pow(x[i] - x[j], 2);
double n = Math.pow(y[i] - y[j], 2);
return Math.sqrt(m + n);
}
private int find(int x) {
if (p[x] == x)
return x;
return p[x] = find(p[x]);
}
}
UVa 10369 - Arctic Network
最新推荐文章于 2018-09-12 23:24:02 发布