#include
#include
#include
#include
#include
using namespace std;
int p[750],rank[750];
//union find
void make_set(int x){
p[x]=x;
rank[x]=0;
}
void link(int x,int y){
if(rank[x]>rank[y])
p[y]=x;
else{
p[x]=y;
if(rank[x]==rank[y]){
rank[y]++;
}
}
}
int find_set(int x){
if(x!=p[x]){
p[x]=find_set(p[x]);
}
return p[x];
}
void Union(int x,int y){
link(find_set(x),find_set(y));
}
bool comp(pair
return A.first
}
int main(){
int n;
while(cin>>n){
double d;
vector
for(int i=0;i
vector
for(int i=0;i
for(int i=0;i
long long dy=pp[i].second-pp[j].second;
edg.push_back(make_pair(sqrt(dx*dx+dy*dy+0.0),make_pair(i,j)));
}
cin>>n;
for(int i=0;i
int u,v;cin>>u>>v;
Union(u-1,v-1);
}
sort(edg.begin(),edg.end(),comp);
double sum=0;
for(int i=0;i
int u,v;
d=edg[i].first;
u=edg[i].second.first;
v=edg[i].second.second;
if(find_set(u)!=find_set(v)){
Union(u,v);
sum+=d;
}
}
printf("%.2lf\n",sum);
}
}
postea ps xD
ResponderEliminar