#include<iostream> #include<cmath> #include<algorithm> using namespace std; const int maxn=101; int father[maxn]; int height[maxn]; struct Point{ float x; float y; int i; }; struct Edge{ float from_x; float from_y; int i; float to_x; float to_y; int j; float weight; bool operator<(const Edge& e)const{ return weight<e.weight; } }; Edge edge[maxn*maxn]; Point point[maxn]; void initial(int n){ for(int i=0;i<n;i++){ father[i]=i; height[i]=0; } } int find(int x){ if(x!=father[x]){ father[x]=find(father[x]); } return father[x]; } void Union(int x,int y){ x=find(x); y=find(y); if(x!=y){ if(height[x]<height[y]){ father[x]=y; } else if(height[x]>height[y]){ father[y]=x; } else{ father[y]=x; height[x]++; } } } float Kruskal(int n,int edgenumber){ initial(n); sort(edge,edge+edgenumber); float answer; for(int i=0;i<edgenumber;i++){ if(find(edge[i].i)!=find(edge[i].j)){ answer+=edge[i].weight; Union(edge[i].i,edge[i].j); } } return answer; } int main(){ int n; while(cin>>n){ for(int i=0;i<n;i++){ cin>>point[i].x>>point[i].y; point[i].i=i; } int k=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ edge[k].from_x=point[i].x; edge[k].from_y=point[i].y; edge[k].to_x=point[j].x; edge[k].to_y=point[j].y; edge[k].i=point[i].i; edge[k].j=point[j].i; edge[k].weight=sqrt((point[j].x-point[i].x)*(point[j].x-point[i].x)+(point[j].y-point[i].y)*(point[j].y-point[i].y)); k++; } } int edgenumber=n*(n-1)/2; printf("%.2f\n",Kruskal(n,edgenumber)); } }