hdu 1875

保存岛与岛之间的距离,把距离从小到大排序,最后用并查集畅通

code:

#include <stdio.h>
#include "math.h"
#include "algorithm"
using namespace std;
int bin[105];
int n;		//n个小岛
int counta;
double result;
struct point		//小岛坐标 
{
	int x;
	int y;
};
struct dis
{
	int a;			//第a小个岛 
	int b;			//第b个小岛 
	double distance;	//距离 
};

double liangdianjuli(point a,point b)
{
	double jl=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
	return jl;
}

int cmp(dis a,dis b)	// 距离从小到大排序 
{
	if(a.distance<b.distance)
	{
		return 1;
	}
	return 0;
}
//------------并查集--------------------
int find(int x)
{
    if(bin[x]!=x) bin[x]=find(bin[x]);
    return bin[x];
}
void merge(dis d,double &p)
{
    int a,b;
    a=find(d.a);
    b=find(d.b);
    if(a!=b)
    {
    	counta+=1;
        bin[a]=b;
        p+=d.distance;
    }

} 
int main(int argc, char *argv[])
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int i;
		 
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			bin[i]=i;		//并查集初始化 
		}
		
		point p[105];		//小岛
		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&p[i].x,&p[i].y);
		} 
		//-----------输出每个点的距离----------------
		int j;
		dis d[10005];		//保存每个小岛间的距离 
		int dweizhi=0;
	
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				double juli;
				juli=liangdianjuli(p[i],p[j]);
				if(juli>=10&&juli<=1000)
				{
					d[dweizhi].a=i;
					d[dweizhi].b=j;
					d[dweizhi].distance=juli;
					dweizhi+=1;
				}
			}
		} 
	//----------开始排序--------------------------
	sort(d,d+dweizhi,cmp);
	//----------开始并查集 -----------------------
	result=0;
	counta=1;
		for(i=0;i<dweizhi;i++)
		{
			merge(d[i],result);
		}
	if(counta!=n)
	{
		printf("oh!\n");
	}
	else{
		printf("%.1lf\n",result*100);
	}
	
		
	}
	return 0;
}

 

你可能感兴趣的:(hdu 1875)