hdu1162

/*
分析;
    第一次写kruskal,改了又改。WA了一次,表笑- -,咱就只知道一个大概的
想法,只WA一次不错了都。当然,1A的话~O(∩_∩)O哈哈~


                                                  2012-06-19
*/







#include"stdio.h"
#include"math.h"
#include"stdlib.h"
struct A
{
	double x,y;
	int head;
}por[111];
struct B
{
	int a,b;
	double len;
}E[4955];
int cmp(const struct B *a,const struct B *b)
{
	if(a->len>b->len)	return 1;
	else				return -1;
}
int main()
{
	int n;
	int k;
	int i,l;
	int temp;
	int aim;
	int com;
	double ans;
	while(scanf("%d",&n)!=-1)
	{
		for(i=1;i<=n;i++)	scanf("%lf%lf",&por[i].x,&por[i].y);

		k=0;
		for(i=1;i<n;i++)
		for(l=i+1;l<=n;l++)
		{
			E[k].a=i;
			E[k].b=l;
			E[k].len=sqrt(pow(por[i].x-por[l].x,2)+pow(por[i].y-por[l].y,2));
			k++;
		}
		for(i=1;i<=n;i++)	por[i].head=i;

		qsort(E,k,sizeof(E[0]),cmp);

		com=0;
		ans=0;
		aim=E[0].a;
		for(i=0;i<k;i++)
		{
			if(com==n-1)	break;

			if(por[E[i].a].head==por[E[i].b].head)	continue;

			if(por[E[i].a].head==aim)
			{
				temp=por[E[i].b].head;
				for(l=1;l<=n;l++)	if(por[l].head==temp)	por[l].head=aim;
			}
			else if(por[E[i].b].head==aim)
			{
				temp=por[E[i].a].head;
				for(l=1;l<=n;l++)	if(por[l].head==temp)	por[l].head=aim;
			}

			else
			{
				temp=por[E[i].b].head;
				for(l=1;l<=n;l++)	if(por[l].head==temp)	por[l].head=por[E[i].a].head;


			}
			ans+=E[i].len;
			com++;
		}
		
		printf("%0.2lf\n",ans);
	}
	return 0;
}


你可能感兴趣的:(hdu1162)