题解:计算欧几里得距离,Krusal加入边权大于等于c的边,统计最后树的边权和。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 2009 using namespace std; int n,c,cnt,tot,ans; int xi[maxn],yi[maxn],fa[maxn]; struct Edge{ int x,y,z; }e[maxn*maxn]; bool cmp(Edge a,Edge b){ return a.z<b.z; } int f(int x){ return fa[x]==x?x:fa[x]=f(fa[x]); } int dis(int i,int j){ return (xi[i]-xi[j])*(xi[i]-xi[j])+(yi[i]-yi[j])*(yi[i]-yi[j]); } int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;i++){ fa[i]=i; scanf("%d%d",&xi[i],&yi[i]); for(int j=1;j<i;j++){ e[++cnt].x=i;e[cnt].y=j;e[cnt].z=dis(i,j); } } sort(e+1,e+cnt+1,cmp); for(int i=1;i<=cnt;i++){ if(e[i].z<c)continue; int fx=f(e[i].x),fy=f(e[i].y); if(fx!=fy){ tot++; fa[fx]=fy; ans+=e[i].z; if(tot==n-1)break; } } if(tot==n-1) printf("%d ",ans); else puts("-1"); return 0; }