题目:http://acm.hdu.edu.cn/showproblem.php?pid=1162
#include<stdio.h>
#include<math.h>
bool P[110];//标记数组,标记某一个点是否已经连接到树上
struct point
{
double x,y;
}Point[110],A[110];
double SegLen(point a,point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int main()
{
int n,i,num,j;
int Min; //Min表示第Min个点到已经连接起来的点的距离最短
double lenth,minlenth,L;//lenth保存两点之间的距离,minlenth保存未连接到树中任一点的最短距离
while(~scanf("%d",&n))
{
//输入所有的点,并初始化所有的点都未连接到已有的树上
for(i = 0; i < n; i++)
{
scanf("%lf%lf",&Point[i].x,&Point[i].y);
P[i] = true;
}
//将第一个点当做根,开始遍历所有点
P[0] = false;
num = 0;
A[num++] = Point[0];
L = 0.0;//z最小长度初始化为0.0
while(num < n)
{
minlenth = 10000000;//每一求最短路的时候初始化最短路为无穷大
for(i = 1; i < n; i++)
{
if( P[i] )
for(j = 0; j < num;j ++)//求树中的点到第i个点的最短距离
{
lenth = SegLen(Point[i],A[j]);
if(minlenth > lenth)
{
minlenth = lenth;//记录最短距离,
Min = i; // 未连接到树上的点中,第i个点到树上某一个点的距离最短
}
}
}
P[Min] = false;
A[num++] = Point[Min];
L += minlenth;
}
printf("%.2lf\n",L);
}
return 0;
}