#include <stdio.h>
#include <math.h>
#include <string.h>
#define _clr(a) memset(a,0,sizeof(a))
#define pow2(a) ((a)*(a))
#define N 101
#define INF 0x7ffffff
bool mark[N];
double path[N];//mark过点集合到未mark过点i的最短距离
int n;
double map[N][N];
double Min (double a,double b)
{
return a<b? a:b;
}
double prim()
{
int i,v,j;
double min,sum=0;
memset(mark,0,sizeof(mark));
mark[0]=1;//先mark一个点
for (i=0;i<n;i++) path[i]=map[0][i];//初始距离
for (i=1;i<n;i++)//剩下n-1个点
{
v=1;
while(mark[v]) v++;//每次先找一个未mark点
min=path[v];
for (j=v+1;j<n;j++)//找出最小值
{
if (!mark[j] && path[j]<min)
{
min=path[j];
v=j;
}
}
if (min==INF) return -1;//有一个点没有路
sum+=min;
mark[v]=1;
for (j=0;j<n;j++)//用新加入的点v修改path
{
if (!mark[j])
{
path[j]=Min(path[j],map[v][j]);
}
}
}
return sum;
}
int main ()
{
//freopen("1162.txt","r",stdin);
int i,j;
double x[N],y[N];
while(scanf("%d",&n)!=EOF)
{
for (i=0;i<n;i++)
{
scanf("%lf%lf",x+i,y+i);
}
for (i=0;i<n-1;i++)
{
map[i][i]=INF;
for (j=i+1;j<n;j++)
{
map[i][j]=sqrt(pow2(x[i]-x[j])+pow2(y[i]-y[j]));
map[j][i]=map[i][j];
}
}
printf("%.2lf\n",prim());
}
}
------------------------------int
#include <stdio.h>
#include <math.h>
#include <string.h>
#define _clr(a) memset(a,0,sizeof(a))
#define pow2(a) ((a)*(a))
#define N 101
#define INF 0x7ffffff
bool mark[N];
int path[N];//mark过点集合到未mark过点i的最短距离
int n;
int map[N][N];
int Min (int a,int b)
{
return a<b? a:b;
}
int prim()
{
int i,v,j;
int min,sum=0;
memset(mark,0,sizeof(mark));
mark[0]=1;//先mark一个点
for (i=0;i<n;i++) path[i]=map[0][i];//初始距离
for (i=1;i<n;i++)//剩下n-1个点
{
v=1;
while(mark[v]) v++;//每次先找一个未mark点
min=path[v];
for (j=v+1;j<n;j++)//找出最小值
{
if (!mark[j] && path[j]<min)
{
min=path[j];
v=j;
}
}
if (min==INF) return -1;//有一个点没有路
sum+=min;
mark[v]=1;
for (j=0;j<n;j++)//用新加入的点v修改path
{
if (!mark[j])
{
path[j]=Min(path[j],map[v][j]);
}
}
}
return sum;
}