已经看了题解改了一部分代码。使用克鲁斯卡尔求最小生成树。坐标开了 long long 是因为之前有一篇讨论说坐标要用 long long 读
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct coordinate{
long long dx,dy;
}s[1007];
int fa[1007],fa_[1007];
struct edge{
int x,y;
int dis;
}e[10000007];
int num;
int now_edge;
double ans;
int fi(int x){
if(fa[x]!=x)fa[x]=fi(fa[x]);
return x;
}
void hb(int x,int y){
fa[x]=y;
return;
}
int dis(long long dx1,long long dy1,long long dx2,long long dy2){
return ((dx1-dx2)*(dx1-dx2)+(dy1-dy2)*(dy1-dy2));
}
bool cmp(edge x,edge y){
return x.dis<y.dis;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>s[i].dx>>s[i].dy;
fa[i]=i;
}
for(int i=1;i<=m;++i){
int u,v;cin>>u>>v;
e[++num].x=u;e[num].y=v;
e[num].dis=0;
}
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j){
e[++num].x=i;e[num].y=j;
e[num].dis=dis(s[i].dx,s[i].dy,s[j].dx,s[j].dy);
}
sort(e+1,e+num+1,cmp);
for(int i=1;i<=num;++i){
int x=e[i].x,y=e[i].y;
int fa_x=fi(x),fa_y=fi(y);
if(fa_x!=fa_y){
hb(fa_x,fa_y);
ans+=(double)sqrt((double)e[i].dis);
++now_edge;
if(now_edge==n-1)break;
}
}
cout<<fixed<<setprecision(2)<<ans<<"\n";
return 0;
}