杭电 1875 畅通工程再续(kruskal)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1875

揭示一个大坑:题目说到不符合条件的岛屿(即10~1000外距离的岛)是会在输出中出现的,这个大部分人可以想到               

                         还有更坑的,不符合条件的岛屿也算在不连通之内,即如果有不合法的岛屿,那么输出oh!当然,还有可能合法岛屿未被连接。

AC代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
struct land
{
	int x,y;
}a[101];
struct node
{
	int u,v;
	double l;
}es[5001];
int par[101];
int n,m;

bool cmp(node a,node b)
{
	return a.l<b.l;
}
int find(int x)
{
	if(x!=par[x]) par[x]=find(par[x]);
	return par[x];
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		m=0;
		for(int i=0;i<101;i++)par[i]=i;
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				es[++m].u=i;
				es[m].v=j;
				es[m].l=sqrt((a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].x-a[j].x)*(a[i].x-a[j].x));
			} 
		}
		sort(es+1,es+m+1,cmp);
		double ans=0;
		int cnt=0;
		for(int i=1;i<=m;i++)
		{
			int fx=find(es[i].u);
			int fy=find(es[i].v);
			if(fx!=fy)
			{
				if(es[i].l<=1000&&es[i].l>=10) 
				{
					par[fx]=fy;
					ans+=es[i].l;
					cnt++;
				}
			}
		}
		if(cnt==n-1) printf("%.1lf\n",ans*100);
		else cout<<"oh!\n";
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jack_jxnu/article/details/81537801
今日推荐