畅通工程再续Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37178 Accepted Submission(s): 12453 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input 输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
Output 每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
Sample Input 2 2 10 10 20 20 3 1 1 2 2 1000 1000
Sample Output 1414.2 oh!
Author 8600 注意: 需要往模板方向靠拢,在要求的条件之下,化为: 村1 村2 距离/价钱 |
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int f[105];
struct shu {
int x;
int y;
} s[105];
void fun(int n) {
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1; i<=n; i++)
scanf("%d%d",&s[i].x,&s[i].y);
}
struct lu {
int x;
int y;
double vague;
} p[10005];
int find(int x) {
while(x!=f[x])x=f[x];
return x;
}
bool cnm(struct lu a,struct lu b) {
return a.vague<b.vague;
}
void join(int x,int y) {
int A,B;
A=find(x);
B=find(y);
if(A!=B)f[A]=B;
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
double sum,tz,d;
int n,c=0,i,j,tx,ty,z;
scanf("%d",&n);
fun(n);
for( i=1; i<=n-1; i++) {
for( j=i+1; j<=n; j++) {
d=sqrt((s[j].x-s[i].x)*(s[j].x-s[i].x)+(s[j].y-s[i].y)*(s[j].y-s[i].y));
if(d>=10&&d<=1000) {
p[c].x=i;
p[c].y=j;
p[c].vague=d;
c++;
}
}
}
sort(p,p+c,cnm);
sum=0;
z=n;
for(i=0; i<c; i++) {
tx=p[i].x;
ty=p[i].y;
tz=p[i].vague;
if(find(tx)==find(ty))continue;
else {
if(z>1) {
join(tx,ty);
sum=sum+tz*100;
z--;
}
}
}
if(z==1)printf("%.1f\n",sum);
else
printf("oh!\n");
}
}