码迷,mamicode.com
首页 > 其他好文 > 详细

Hdu oj 1875 畅通工程再续

时间:2015-08-12 21:49:35      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

题目:点击打开链接

分析:代码一为AC的代码,代码二为自己在代码一的基础上优化的代码,测试多种结果都正确,但是确不能AC,后来发现,优化之后,出现了问题。

代码一:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct stu
{
	int x,y;
	double d;
}a1[10000];
struct stl
{
	int x,y;
}a2[110];
int per[10000];
int a;
void init()//初始化函数 
{
	int i;
	for(i=0;i<=a;i++)
	per[i]=i;	
}
int find(int x)
{
	if(x==per[x])
		return x;
	return per[x]=find(per[x]);
}
bool join(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx!=fy)
	{
		per[fx]=fy;
		return true;
	}
	else
		return false;
}
double ds(int x1,int x2,int y1,int y2)
{
	double a=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
	return sqrt(a);
}
int cmp(stu x,stu y)
{
	return x.d<y.d;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int i,j,k;
		double sum=0,distance=0;
		scanf("%d",&a);
		for(i=0;i<a;i++)
			scanf("%d%d",&a2[i].x,&a2[i].y);
		init();
		k=0;
		for(i=0;i<a;i++) //存编号 
			for(j=i+1;j<a;j++)
			{
				distance=ds(a2[i].x,a2[j].x,a2[i].y,a2[j].y);//注意别把下标搞错了。 
				a1[k].x=i;
				a1[k].y=j;
				a1[k].d=distance;
				k++;	
			}
		sort(a1,a1+k,cmp);
		for(i=0;i<k;i++)
		{
			if(a1[i].d>=10&&a1[i].d<=1000&&join(a1[i].x,a1[i].y))
			sum+=a1[i].d;
		}
		k=0;
		for(i=1;i<a;i++)//如果联通只存在一个父节点 
		{
			if(find(i)!=find(i-1))
				k=1;
		}
		if(k)
			printf("oh!\n");
		else
			printf("%.1lf\n",sum*100);
	}	
	return 0;
}


代码二:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define INF 0xffff
struct stu
{
	int x,y;
	double d;
	int link;
}a1[110];
int per[110];
int a;
void init()
{
	int i;
	for(i=1;i<=a;i++)
	{
		per[i]=i;
		a1[i].d=INF;
		a1[i].link=0;
	}		
}
int find(int x)
{
	if(x==per[x])
		return x;
	return per[x]=find(per[x]);
}
bool join(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx!=fy)
	{
		per[fx]=fy;
		return true;
	}
	else
		return false;
}
double ds(int x1,int x2,int y1,int y2)
{
	double a=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
	return sqrt(a);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int i,j,k;
		double sum=0,distance=0;
		scanf("%d",&a);
		for(i=1;i<=a;i++)
			scanf("%d%d",&a1[i].x,&a1[i].y);
		init();
		for(i=1;i<=a;i++)//与代码一不同的是,连接的时候,确保每一次最短的相连,但是确不能确保把所有的点都连接起来。 
		{
			for(j=1;j<=a;j++)
			{
				if(j!=i)
				{
					distance=ds(a1[i].x,a1[j].x,a1[i].y,a1[j].y);
					if(distance>1000||distance<10)
						distance=INF;
					if(a1[i].d>distance)
					{
						a1[i].d=distance;
						a1[i].link=j;
					}
				}
			}
		}
		k=0;
		for(i=1;i<=a;i++)
		{
			if(a1[i].link!=0)
			  if(join(i,a1[i].link))
				sum+=a1[i].d;
		}
		for(i=2;i<=a;i++)
		{
			if(find(i)!=find(i-1))
				k=1;
		}
		if(k)
			printf("oh!\n");
		else
			printf("%.1lf\n",sum*100);
	}	
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Hdu oj 1875 畅通工程再续

标签:

原文地址:http://blog.csdn.net/zm_11/article/details/47450279

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!