HDU 1875 畅通工程再续

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 1009
using namespace std;
int t,c,ok;
int d[N];
double ans = 0;
void init()
{
	for (int i = 1; i <= c; i++)
		d[i] = i;
}
struct point
{
	int x, y;
}a[N];
struct EG
{
	int x, y;
	double length;
	EG(int xx, int yy,double ll) :x(xx), y(yy),length(ll){}
	EG(){}
	bool operator < (const EG& x1)const
	{
		return this->length < x1.length;
	}
};
inline double Length(const point &x1, const point &x2)
{
	double l = (x1.x - x2.x)*1.0*(x1.x - x2.x)*1.0 + (x1.y - x2.y)*1.0*(x1.y - x2.y)*1.0;
	return sqrt(l);
}
vector<EG>vc;
int find(int x)
{
	if (x != d[x])d[x] = find(d[x]);
	return d[x];
}
void unio(int x1, int x2)
{
	int y1 = find(x1);
	int y2 = find(x2);
	if (y1 != y2)d[y1] = y2;
}
void kruskal()
{
	init();
	for (int i = 0; i < vc.size(); i++)
	{
		if (vc[i].length >= 10.0 && vc[i].length <= 1000.0)
		{
			if (find(vc[i].x) != find(vc[i].y))
			{
				ok++;
				unio(vc[i].x, vc[i].y);
				ans += vc[i].length;
			}
		}
	}
}
int main()
{
#ifdef CDZSC
	freopen("i.txt", "r",stdin);
#endif
	scanf("%d", &t);
	while (t--)
	{
		ok = 0; ans = 0;
		vc.clear();
		memset(a, 0, sizeof(a));
		scanf("%d", &c);
		for (int i = 1; i <= c; i++)
			scanf("%d%d", &a[i].x, &a[i].y);
		for (int i = 1; i <= c; i++)
			for (int j = i+1; j <= c; j++)
				if (i!=j)vc.push_back(EG(i, j, Length(a[i], a[j])));
		sort(vc.begin(), vc.end());
		kruskal();
		if (ok == c - 1)printf("%.1lf\n", ans*100);
		else puts("oh!");
	}
	return 0;
}

很水的一题,将所有的二重循环枚举边之间的距离求出,套模板就过了,判读当(合并边的次数 ==点的个数-1)则有解

畅通工程再续

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20729    Accepted Submission(s): 6543


Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 

Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
 

Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
 

Sample Input
   
   
   
   
2 2 10 10 20 20 3 1 1 2 2 1000 1000
 

Sample Output
   
   
   
   
1414.2 oh!

你可能感兴趣的:(HDU 1875 畅通工程再续)