#Description
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数
#include <cstdio>
#include <climits>
#include <cmath>
using namespace std;
double a[101][101],lowcost[101],x[101],y[101]; bool v[101];
double o(double s){return s*s;}
int main(){
int n,k; double min,s=0;
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%lf%lf",&x[i],&y[i]);
for (int j=1;j<=n;j++)
if (i!=j){
double sum=sqrt(o(x[i]-x[j])+o(y[i]-y[j]));//勾股定理
a[i][j]=sum; a[j][i]=sum;
}
lowcost[i]=a[1][i];
} v[1]=1;
for (int i=1;i<=n-1;i++){
min=10001;
for (int j=1;j<=n;j++)
if (lowcost[j]<min&&!v[j]){
min=lowcost[j];
k=j;
}
s+=min;
v[k]=1;
for (int j=1;j<=n;j++) if (a[k][j]<lowcost[j]) lowcost[j]=a[k][j];
}
printf("%.2lf",s); return 0;
}