典型的最小生成树题,我用的prim算法,应该还有其他很多方法。
import java.util.Scanner;
public class Hdu1162 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
double [] x=new double[n];
double [] y=new double[n];
for(int i=0;i<n;i++){
x[i]=sc.nextDouble();
y[i]=sc.nextDouble();
}//输入数据完毕
double [][]distance=new double[n][n]; //用来记录各点间长度
//计算各点之间的长度
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
distance[i][j]=Double.MAX_VALUE;
}
else
distance[i][j]=Math.sqrt(Math.pow(x[j]-x[i],2)+Math.pow(y[j]-y[i], 2));
}
}
double sum1=prim(n,distance);
System.out.printf("%.2f",sum1).println();
}
}
//调用prim算法
static double prim(int n,double[][] c){
double[] lowcost=new double[n]; //记录当前最短路径各点距离
int [] closet =new int [n]; //记录当前临接点
boolean[] s=new boolean[n]; //标志数组
//赋初值
s[0]=true;
for(int i=1;i<n;i++){
lowcost[i]=c[0][i];
closet[i]=0;
s[i]=false;
}
double sum=0; //记录最短路径长度
//从这开始处理数据
for(int i=1;i<n;i++){
double min=Double.MAX_VALUE;
int j=1;//用来记录下一个临接点
for(int k=1;k<n;k++){
if(lowcost[k]<min&&!s[k]){//找出当前权值最小的
min=lowcost[k];
j=k; //记录下一个临接点
}
}
s[j]=true;
sum+=c[closet[j]][j];
//从这开始更新lowcost[]数组
for(int k=1;k<n;k++){
if(c[j][k]<lowcost[k]&&!s[k]){
lowcost[k]=c[j][k];
closet[k]=j;
}
}
}
return sum;
}
}