#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