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;
}


 

原文地址:https://www.cnblogs.com/LUO257316/p/3220845.html