HDOJ1162Eddy's picture
题目: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; }