prim,O(n^2)求最小生成树。每次贪心的把最小边加进去。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define pa pair<int,int>
#define N 2010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,c,tot=0,d[N],ans=0;
struct node{int x,y;}a[N];
bool vis[N];
void prim(){
priority_queue<pa,vector<pa>,greater<pa> >q;memset(d,0x3f,sizeof(d));
d[1]=0;q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;q.pop();
if(vis[x]) continue;vis[x]=1;++tot;ans+=d[x];
for(int i=1;i<=n;++i){
if(vis[i]) continue;int dx=(a[x].x-a[i].x)*(a[x].x-a[i].x)+(a[x].y-a[i].y)*(a[x].y-a[i].y);
if(dx>=c&&dx<d[i]) d[i]=dx,q.push(make_pair(d[i],i));
}
}
}
int main(){
// freopen("a.in","r",stdin);
n=read();c=read();
for(int i=1;i<=n;++i) a[i].x=read(),a[i].y=read();
prim();
if(tot!=n) puts("-1");
else printf("%d\n",ans);
return 0;
}