数据太水了,所以用暴力求的距离。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/7/24.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100+10;
struct node{
float x,y;
}node[maxn];
struct edge{
int u,v;
float w;
bool operator < (struct edge p)const{
return w<p.w;
}
}edge[maxn*maxn];
int pa[maxn*maxn];
int getroot(int a) {return pa[a]==a?a:pa[a]=getroot(pa[a]);}
float dis(int i,int j)
{
float x1,y1,x2,y2;
x1=node[i].x,y1=node[i].y;
x2=node[j].x,y2=node[j].y;
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int n,cnt=0;
float ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) pa[i]=i;
for(int i=0;i<n;i++) scanf("%f%f",&node[i].x,&node[i].y);
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
edge[cnt].u=i;
edge[cnt].v=j;
edge[cnt].w=dis(i,j);
cnt++;
}
}
sort(edge,edge+cnt);
for(int i=0;i<cnt;i++)
{
int root1,root2;
root1=getroot(edge[i].u);
root2=getroot(edge[i].v);
if(root1==root2) continue;
pa[root2]=root1;
ans+=edge[i].w;
}
printf("%.2f\n",ans);
return 0;
}