#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct node{
int x;
int y;
};
struct road{
int x;
int y;
double len;
};
int f[105];
bool cmp(road a,road b){
return a.len<b.len;
}
double dis(int x,int y,int x1,int y1){
return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}
int find(int x){
if(f[x]==x) return x;
return find(f[x]);
}
int merge(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
f[fy]=fx;
return 1;
}
return 0;
}
int main()
{
int t,c;
cin>>t;
while(t--){
cin>>c;
node a[105];
double dp[105][105];
double sum=0;
int ans=0;
road r;
int i,j;
vector<road> v;
memset(dp,0,sizeof(dp));
for(i=0;i<=100;i++) f[i]=i;
for(i=0;i<c;i++){
cin>>a[i].x>>a[i].y;
}
for(i=0;i<c;i++){
for(j=0;j<c;j++){
if(i==j) dp[i][j]=0;
else dp[i][j]=dis(a[i].x,a[i].y,a[j].x,a[j].y);
if(10<=dp[i][j]&&dp[i][j]<=1000){
r.len=dp[i][j];
r.x=i;
r.y=j;
v.push_back(r);
}
}
}
sort(v.begin(),v.end(),cmp);
int flag=0;
for(i=0;i<v.size();i++){
if(merge(v[i].x,v[i].y)){
ans++;
sum+=v[i].len*100;
}
if(ans==c-1){
flag=1;
break;
}
}
if(flag==1) printf("%.1f\n",sum);
else printf("oh!");
}
return 0;
}
HDU 畅通工程再续
猜你喜欢
转载自blog.csdn.net/qq_37016724/article/details/88822531
今日推荐
周排行