题意这样:就是有几个离的远的炮楼要通信,你可以想象他们在一片空海上,然后几个炮楼得通信啊,那有2种方法,一种是通过一个卫星,这个卫星能保证且只能保证两个炮楼间通信。另一种是炮楼里的每个人都有一个对讲机,他们可以通过这个东西与别的人通信,但对讲机功率有限,只能和一定功率能覆盖的范围内的炮楼里头的人说话。这个通信可以直接通,也可以通过中间的人转接你要通话的目标对象。所以设计算法求出来功率最小是多少就能保证这一圈炮楼里头所有人都可以CALL到对方。其中s代表卫星数,p代表炮楼数,然后输入这些炮楼的坐标。你去算功率最小是多少吧。
package com.liang.poj;
import java.util.Scanner;
public class Test2349Prim {
static int num = 0;
static int s = 0;
static int p = 0;
static int[][] coordinate = null;
static double[][] brimCollection = null;
static boolean[] visited = null;
static double[] result = null;
static boolean b = true;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
num = scan.nextInt();
while (num > 0) {
s = scan.nextInt();
p = scan.nextInt();
brimCollection = new double[p][p];
visited = new boolean[p];
coordinate = new int[p][2];
result = new double[p];
for (int i = 0; i < coordinate.length; i++) { // 初始化coordinate,接收输入的每个城市的坐标
coordinate[i][0] = scan.nextInt();
coordinate[i][1] = scan.nextInt();
}
for (int i = 0; i < coordinate.length; i++) { // 初始化brimColeciont,将每个城市之间的距离转化为矩阵图
for (int j = 0; j < coordinate.length; j++) {
if (i != j) {
int x = coordinate[i][0] - coordinate[j][0];
int y = coordinate[i][1] - coordinate[j][1];
brimCollection[i][j] = Math.sqrt(x * x + y * y);
if (b) {
result[j] = brimCollection[i][j];
}
}
}
b = false;
}
visited[0] = true;
prim(p - 1);
b = true;
num--;
}
}
public static void prim(int count) {
while (count >= 1) {
int lie = min();
count--;
for (int i = 1; i < result.length; i++) {
if (!visited[i] && result[i] > brimCollection[lie][i]) {
result[i] = brimCollection[lie][i];
}
}
}
double d = result[s + 1];
int dmin = (int) Math.round(d * 100);
System.out.println((double) dmin / 100);
}
public static int min() {
double min = 0;
int lie = 0;
for (int i = 1; i < result[i]; i++) {
if (!visited[i] && result[i] != 0) {
min = result[i];
lie = i;
break;
}
}
for (int i = 1; i < result.length; i++) {
if (!visited[i] && result[i] != 0) {
if (min > result[i]) {
min = result[i];
lie = i;
}
}
}
if (lie != 0) {
visited[lie] = true;
}
return lie;
}
}