借鉴了某篇题解,但写废了qwq,小号悬关
#include<bits/stdc++.h>
#define maxm 1000005
#define inf 0x3f3f3f3f
using namespace std;
int k1,k2,m,n,fa[maxm],a[1005][1005],cnt;
double ans,maxx;
bool kkksc03=true;
struct node{
int x,y;
}e[maxm];
struct kkk{
int x,y;
double z;
}edge[maxm];
bool cmp(kkk &a,kkk &b){
return a.z<b.z;
}
int getfa(int x){
if(fa[x]==x)return x;
return fa[x]=getfa(fa[x]);
}
void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}
void mst(){
int f1,f2,k=0;
for(int i=1;i<=cnt;i++){
f1=getfa(edge[i].x);
f2=getfa(edge[i].y);
if(f1!=f2){
ans+=edge[i].z;
fa[f1]=f2;
k++;
//cout<<f1<<" "<<f2<<" "<<ans<<endl;
}
if(k==n-1){
break;
}
}
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>e[i].x>>e[i].y;
for(int j=1;j<i;j++){
edge[++cnt].z=sqrt((0.0+e[i].x-e[j].x)*(0.0+e[i].x-e[j].x)+(0.0+e[i].y-e[j].y)*(0.0+e[i].y-e[j].y));
edge[cnt].x=e[i].x;
edge[cnt].y=e[i].y;
a[i][j]=cnt;
}
}
init();
for(int i=1;i<=m;i++){
cin>>k1>>k2;
edge[a[k1][k2]].z=0.0;
edge[a[k2][k1]].z=0.0;
}
sort(edge+1,edge+cnt+1,cmp);
mst();
printf("%.2lf",ans);
return 0;
}