//kruskal 并查集
//任意两个小岛之间的距离>=10 , <=1000 ,造价为100元/km
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<double,double>PII;
const int maxv=100+5;
const int maxe=10000+5;
struct Edge{
int from,to;
double dist;
};
bool operator<(const Edge &E1,const Edge &E2)
{
return E1.dist<E2.dist;
}
PII island[maxv];
Edge edges[maxe];
int parent[maxv];
int find(int x)
{
return x==parent[x]?x:parent[x]=find(parent[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int c;
scanf("%d",&c);
//计算每个小岛到其他小岛的距离,并记录进入edges数组
for(int i=1;i<=c;i++)
{
scanf("%lf%lf",&island[i].first,&island[i].second);
}
int ans=0;
for(int i=1;i<c;i++)
for(int j=i+1;j<=c;j++)
{
double cost=hypot(island[i].first-island[j].first,island[i].second-island[j].second);
if(cost>=10&&cost<=1000) {
edges[ans].from=i;
edges[ans].to=j;
edges[ans].dist=cost;
ans++;
}
}
sort(edges,edges+ans);
int e=c-1;
for(int i=1;i<=c;i++)
parent[i]=i;
double sum=0;
for(int i=0;i<ans;i++)
{
int p1=find(edges[i].from);
int p2=find(edges[i].to);
if(p1==p2) continue;
parent[p1]=p2;
e--;
sum+=edges[i].dist;
}
if(e) printf("oh!\n");
else printf("%.1f\n",sum*100);
}
return 0;
}
//任意两个小岛之间的距离>=10 , <=1000 ,造价为100元/km
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<double,double>PII;
const int maxv=100+5;
const int maxe=10000+5;
struct Edge{
int from,to;
double dist;
};
bool operator<(const Edge &E1,const Edge &E2)
{
return E1.dist<E2.dist;
}
PII island[maxv];
Edge edges[maxe];
int parent[maxv];
int find(int x)
{
return x==parent[x]?x:parent[x]=find(parent[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int c;
scanf("%d",&c);
//计算每个小岛到其他小岛的距离,并记录进入edges数组
for(int i=1;i<=c;i++)
{
scanf("%lf%lf",&island[i].first,&island[i].second);
}
int ans=0;
for(int i=1;i<c;i++)
for(int j=i+1;j<=c;j++)
{
double cost=hypot(island[i].first-island[j].first,island[i].second-island[j].second);
if(cost>=10&&cost<=1000) {
edges[ans].from=i;
edges[ans].to=j;
edges[ans].dist=cost;
ans++;
}
}
sort(edges,edges+ans);
int e=c-1;
for(int i=1;i<=c;i++)
parent[i]=i;
double sum=0;
for(int i=0;i<ans;i++)
{
int p1=find(edges[i].from);
int p2=find(edges[i].to);
if(p1==p2) continue;
parent[p1]=p2;
e--;
sum+=edges[i].dist;
}
if(e) printf("oh!\n");
else printf("%.1f\n",sum*100);
}
return 0;
}