感觉思路没问题
#include<bits/stdc++.h>
using namespace std;
struct node
{
long long int x,y;
double z;
}edge[2000001];
struct zuobiao
{
long long int he,zo;
}b[1000001];
long long int fa[1000001];
int n,m;
int tot;
bool vis[1000001],vis1[1000001];
double l,r,l1,r1;
double juli(long long int x,long long int y,long long int x1,long long int y1)
{
l=x*1.0;
r=y*1.0;
l1=x1*1.0;
r1=y1*1.0;
return sqrt(((l1-l)*(l1-l))+((r1-r)*(r1-r)));
}
bool cmp(node l,node r)
{
return l.z<r.z;
}
long long int find(long long int x)
{
if(fa[x]==x)
{
return x;
}
return fa[x]=find(fa[x]);
}
double kruskal()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
sort(edge+1,edge+tot+1,cmp);
int num=0;
double minn=0.0;
for(int i=1;i<=tot;i++)
{
long long int x=find(edge[i].x);
long long int y=find(edge[i].y);
if(x!=y)
{
fa[x]=y;
minn+=edge[i].z;
num++;
if(num==n-1)
{
return minn;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>b[i].he>>b[i].zo;
}
for(int i=1;i<=m;i++)
{
cin>>edge[i].x>>edge[i].y;
if(edge[i].x>edge[i].y)
{
swap(edge[i].x,edge[i].y);
}
vis[edge[i].x]=1;
vis1[edge[i].y]=1;
edge[i].z=0.0;
}
tot=m;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(vis[i]==1&&vis1[j]==1)
{
continue;
}
tot++;
edge[tot].x=i;
edge[tot].y=j;
edge[tot].z=juli(b[i].he,b[i].zo,b[j].he,b[j].zo);
}
}
double ans=kruskal();
printf("%.2lf",ans);
return 0;
}