#include<iostream> #include<cmath> #include<vector> using namespace std; const int Max=1001; vector <vector <double> > mat; vector <double> dist; vector <bool> visited; int n; int minVertex() { int next=-1; for (int i=0;i<n;i++) { if (visited[i]==false && (next==-1 || dist[i]<dist[next])) { next = i; } } return next; } double Prim() { dist=mat[0]; fill(visited.begin(),visited.end(),false); visited[0]=true; double cost=0; int i; bool flag=true; for(i=1;i<n;i++) { int next=minVertex(); visited[next]=true; if (dist[next]==Max) //不连通 { flag=false; break; } cost+=dist[next]; for (int j=0;j<n;j++) { if (visited[j]==false && mat[next][j]<dist[j]) { dist[j]=mat[next][j]; } } } if (flag==false) return -1; else return cost; } struct Position { int x,y; }; vector <Position> islands; double dist2Pos(Position a,Position b) { return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))); } void run() { scanf("%d",&n); islands.resize(n); int i; for(i=0;i<n;i++) scanf("%d %d",&islands[i].x,&islands[i].y); mat.resize(n); visited.resize(n); for(i=0; i<n; i++) { mat[i].resize(n); fill(mat[i].begin(),mat[i].end(),Max); mat[i][i]=0; } for(i=0; i<n; i++) { for(int j=0;j<n;j++) { double d=dist2Pos(islands[i],islands[j]); if (d>=10 && d<=1000) { mat[i][j]=d; mat[j][i]=d; } } } double cost=Prim(); if (cost!=-1) printf("%.1lf/n",cost*100); else printf("oh!/n"); } int main() { int total; scanf("%d",&total); for(int now=1; now<=total; now++) run(); return 0; }