这道题是最小生成树的简单应用
题目链接
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,m;
double ans;
int cnt;
int x[1010],y[1010];
int f[1010];
struct node{
int u;
int v;
double w;
}e[2000020];
double dis(int i,int j){
int x1=x[i],y1=y[i];
int x2=x[j],y2=y[j];
double d;
d=(double)sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));//着重注意这里的写法
return d;
}
bool cmp(node a,node b){
return a.w<b.w;
}
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
void kruskal(){
sort(e+1,e+1+cnt,cmp);
for(int i=1;i<=cnt;++i){
int x=e[i].u;
int y=e[i].v;
if(find(x)==find(y))
continue;
f[find(x)]=find(y);
ans+=e[i].w;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>x[i]>>y[i];
f[i]=i;
}
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
cnt++;
e[cnt].u=i;
e[cnt].v=j;
e[cnt].w=dis(i,j);
}
}
int a,b;
for(int i=1;i<=m;++i){
cin>>a>>b;
f[find(a)]=find(b);
}
kruskal();
printf("%.2lf",ans);
return 0;
}