HDU 1875 - 畅通工程再续

Posted nicetomeetu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1875 - 畅通工程再续相关的知识,希望对你有一定的参考价值。

最小生成树

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int t,n,cnt;
double cost;
int mapx[1005],mapy[1005];
int f[1005];
struct edge{
	int a,b;
	double e;
} map[1000000];
double cal(int& a,int& b)
{
	return sqrt(1.0*( (mapx[a]-mapx[b])*(mapx[a]-mapx[b]) + (mapy[a]-mapy[b])*(mapy[a]-mapy[b]) ));
}
bool cmp(edge a,edge b)
{
	return a.e<b.e;
}
int sf(int x){
	return x==f[x]? x: f[x]=sf(f[x]);
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++) f[i]=i;
		cnt=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&mapx[i],&mapy[i]);
			for(int j=1;j<i;j++)
			{
				double e=cal(i,j);
				if(e>=10&&e<=1000)
				{
					map[cnt].a=j;
					map[cnt].b=i;
					map[cnt].e=e;
					cnt++;
				}
			}
		}
		sort(map,map+cnt,cmp);
		cost=0;
		int fa,fb;
		for(int i=0;i<cnt;++i)
		{
			fa=sf(map[i].a);
			fb=sf(map[i].b);
			if(fa!=fb)
			{
				f[fa]=fb;
				cost+=map[i].e;
			}
		}
		int p=0;
		for(int i=1;i<=n;i++) if(sf(f[i])==i) p++;
		if(p>1) puts("oh!");
		else printf("%.1lf\n",cost*100);
	}
}

 

以上是关于HDU 1875 - 畅通工程再续的主要内容,如果未能解决你的问题,请参考以下文章

畅通工程再续 HDU - 1875

HDU 1875 - 畅通工程再续

HDU 1875 畅通工程再续 (Prim)

hdu1875 畅通工程再续最小生成树

畅通工程再续 HDU - 1875

HDU 1875 畅通工程再续 (最小生成树prim)