http://acm.hdu.edu.cn/showproblem.php?pid=1162
题目 | 算法 | 备注 |
给出坐标,求连接坐标的最小生成树 | prime 最小生成树 | |
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n,i,j;
Scanner oo=new Scanner(System.in);
while(oo.hasNext()){
n=oo.nextInt();
double x[]=new double[n+1];
double y[]=new double[n+1];
double a[][]=new double[n+1][n+1];
for(i=1;i<=n;i++){
x[i]=oo.nextDouble();
y[i]=oo.nextDouble();
}
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
a[i][j]=Math.hypot(y[j]-y[i], x[j]-x[i]);
a[j][i]=a[i][j];
}
}
double d[]=new double[n+1];
for(i=1;i<=n;i++){
d[i]=a[1][i];
}
boolean f[]=new boolean[n+1];
double min=200000000,tree=0;
int u=0;
for(i=0;i<n;i++){
min=2000000000;
for(j=1;j<=n;j++){
if(f[j]==false&&d[j]<min){
min=d[j];
u=j;
}
}
tree=tree+min;
f[u]=true;
for(j=1;j<=n;j++){
if(f[j]==false&&a[u][j]<d[j]){
d[j]=a[u][j];
}
}
}
System.out.printf("%.2f",tree);
System.out.println();
}
}
}