http://acm.hdu.edu.cn/showproblem.php?pid=1875
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node
{
int u;
int v;
double w;
} edge[10000+66];
struct point
{
int x;
int y;
int index;
}point[200];
int pre[200];
int n,m;
int cnt;
int cnt1;
bool cmp(const node&a,const node&b )
{
return a.w<b.w;//定义排序方法;
}
int find(int x)
{
return x==pre[x]?x:pre[x]=find(pre[x]);
//return
}
void unions(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
}
}//并查集方法;
void createGraph()
{
for(int i=0; i<m; i++)pre[i]=i;
for(int i=0;i<m;i++){
cin>>point[i].x>>point[i].y;
point[i].index=i;
}
cnt1=0;
for(int i=0; i<m; i++)
{
for(int j=0;j<m;j++){
edge[cnt1].u=point[i].index;
edge[cnt1].v=point[j].index;
//cout<<point[i].index<<"index"<<point[j].index<<endl;
double s=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
edge[cnt1].w=s;
//cout<<edge[cnt1].w<<endl;
cnt1++;
}
}
}
double kruscal()
{
double ans=0;
cnt=0;
//cout<<cnt1<<"cnt1"<<endl;
sort(edge,edge+cnt1,cmp);//排序;
for(int i=0; i<cnt1; i++)
{
//cout<<find(edge[i].u)<<"dfsd"<<find(edge[i].v)<<endl;
if(find(edge[i].u)!=find(edge[i].v)&&(edge[i].w>=10&&edge[i].w<=1000))
{//如果没有公共节点就合并;
unions(edge[i].u,edge[i].v);
//cout<<edge[i].w<<endl;
ans+=double(100.0*edge[i].w);
//cout<<ans<<endl;
cnt++;
}
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cnt=0;
cnt1=0;
cin>>m;
createGraph();
double ss=kruscal()*1.0;
if((cnt<m-1)){cout<<"oh!"<<endl;}
else printf("%0.1lf\n",ss);
}
return 0;
}