#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int pa[105],rk[105];
double xx[105],yy[105];
double ans;
struct edge{
int u,v;
double c;
}e[10010];
bool cmp(const edge& a,const edge& b){
return a.c<b.c;
}
void make(int x){
pa[x]=x;
rk[x]=0;
}
int findd(int x){
if(x!=pa[x])
pa[x]=findd(pa[x]);
return pa[x];
}
void unite(int x,int y,double w){
x=findd(x);
y=findd(y);
if(x==y) return ;
ans+=w;
if(rk[x]<rk[y])
pa[x]=y;
else{
pa[y]=x;
if(rk[x]==rk[y])
rk[x]++;
}
}
int main(){
int T;
int n,k;
double dis;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
//memset(e,0,sizeof(e));
for(int i=1;i<=n;i++){
make(i);
}
for(int i=1;i<=n;i++){
scanf("%lf%lf",&xx[i],&yy[i]);
}
k=0;
ans=0.0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
dis=sqrt((xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]));
if(dis>=10&&dis<=1000){
e[k].u=i;
e[k].v=j;
e[k++].c=dis;
}
}
}
sort(e,e+k,cmp);
for(int i=0;i<k;i++){
int x=findd(e[i].u);
int y=findd(e[i].v);
if(x!=y) unite(x,y,e[i].c);
}
int cnt=0;
for(int i=1;i<=n;i++){
if(pa[i]==i)
cnt++;
}
if(cnt==1) printf("%.1f\n",ans*100);
else printf("oh!\n");
}
return 0;
}
hdu1875
最新推荐文章于 2020-02-07 11:05:28 发布