您的位置:首页 > 其它

并查集专题-1001 Freckles

2015-08-28 20:57 295 查看
(I) 原文就不给出了,题目原文意思是:在一个二维平面内有多个点,求 出能把他们全部连接在一起的最短长度;

也就是让你求若干二维点构成的最小生成树;

Prim 算法:



#include<stdio.h>
#include<math.h>
#include<string.h>
#define Max 999999999.0
int v[101];
double d[101],dd[101][101];
int n;
struct Point
{
	double x,y;
}m[101];
double dis(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 i,j,k;
double ans;
	while(~scanf("%d",&n))
	{
		for(i=1;i<=n;i++)
	{
		scanf("%lf %lf",&m[i].x,&m[i].y);
	}
	memset(v,0,sizeof(v));
	for(i=1;i<=n;i++)
	 {
 		for(j=i+1;j<=n;j++)
 	   {
	 	 dd[i][j]=dd[j][i]=dis(m[i],m[j]);
 	   }
 	   dd[i][i]=0.0;
	 }
	 ans=0.0;
	 for(int i=1;i<=n;i++)
	 {
 		d[i]=dd[1][i];
 	 }
	 while(1)
	 {
 		j=-1;
 		double min=Max;
 		for(i=1;i<=n;i++)
 		{
		 	if(!v[i]&&d[i]<min)
		 	 {
 	 			j=i;
 	 		    min=d[i];	
 	 		}
	    }
	    if(j==-1)
	    {
    		printf("%.2lf\n",ans);
			break;
    	}
    	  v[j]=1;
	    ans+=min;
    	for(i=1;i<=n;i++)
    	{
	    	if(!v[i]&&d[i]>dd[j][i])
	    	 {
 	    	  d[i]=dd[j][i];	
 	    	 }
	    }
 	}	 
    } 
}
Krusal算法:



#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct Point
{
	double x,y;
}m[102];
struct edge
{
	int a,b;
	double len; 
}e[5600];
int n,num,pre[102];
double ans;
double dis(Point a,Point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(edge a,edge b)
{
	return a.len<b.len;
}
int find(int x)
{
	if(x!=pre[x])
	pre[x]=find(pre[x]);
	return pre[x];
}
void Union(int a,int b)
{
	a=find(a);
	b=find(b);
	pre[a]=b;
}
void init()
{
	int i,j;
	for(i=1;i<=n;i++)
	  pre[i]=i;
    for(i=1;i<=n;i++)
    {
    	for(j=i+1;j<=n;j++)
    	{
	    	e[num].a=i;
	    	e[num].b=j;
	    	e[num].len=dis(m[i],m[j]);
	    	num++;
	    }
    }
}
int main()
{
	int i,j,a,b;
	while(~scanf("%d",&n))
	{
		for(i=1;i<=n;i++)
		 scanf("%lf %lf",&m[i].x,&m[i].y);
	   num=0;
	   ans=0.0;
	   init();
	   sort(e,e+num,cmp);
	   int flag=0;
	   for(i=0;i<num&&flag<n-1;i++)
	   {
   	     a=find(e[i].a);
		 b=find(e[i].b);
			if(a!=b)
			{
		     Union(a,b);
			 ans+=e[i].len;
			 flag++;		
			}	
   	   }
   	   printf("%.2lf\n",ans);
	}
}

扩展: 上面的题目讲的是二维点,我们将二维扩展到三维空间内谈论;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: