我用的kruskal搞最小生成树,不知道为啥寄了,大佬看一下吧qwq
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#define ll long long
#define ull unsigned long long
#define maxn 2001
using namespace std;
struct Edge
{
int u,v;
double w;
}edge[maxn];
struct str
{
int x,y;
}point[maxn];
int n,m;
int cnt;
int fa[maxn];
int num;
double ans;
double dis(int Xa,int Ya,int Xb,int Yb)
{
return (double)(sqrt((double)(pow(Xa-Xb,2))+(double)(pow(Ya-Yb,2))));
}
void add(int u,int v,double w)
{
edge[++cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
}
bool cmp(Edge x,Edge y)
{
if(x.w==y.w)
{
return x.u<y.u;
}
return x.w<y.w;
}
int _find(int x)
{
if(x==fa[x])
{
return x;
}
return fa[x]=_find(fa[x]);
}
void _merge(int x,int y)
{
fa[_find(x)]=_find(y);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
cin>>point[i].x>>point[i].y;
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
double w=dis(point[i].x,point[i].y,point[j].x,point[j].y);
add(i,j,w);
}
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v,0.0);
}
sort(edge+1,edge+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
int fx=_find(edge[i].u),fy=_find(edge[i].v);
if(fx!=fy)
{
num++;
ans+=edge[i].w;
_merge(fx,fy);
}
if(num==n-1)
{
break;
}
}
cout<<fixed<<setprecision(2)<<ans;
return 0;
}