90分……
不知道那错了,谢谢大佬指点
#9 WA了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c,k,fa[1000005];
struct node{
int u,v,w;
}edge[1000005];
struct x{
int x,y;
}pos[1000005];
int find(int k1){
if(k1!=fa[k1])
return fa[k1]=find(fa[k1]);
return fa[k1];
}
bool cmp(node x,node y){
return x.w<y.w;
}
signed main(){
cin>>n>>c;
for(int i=1 ; i<=n ; i++){
cin>>pos[i].x>>pos[i].y;
fa[i]=i;
}
for(int i=1 ; i<=n ; i++)
for(int j=i+1 ; j<=n ; j++){
int dis=(int)pow(pos[i].x-pos[j].x,2)+(int)pow(pos[i].y-pos[j].y,2);
if(dis>=c){
k++;
edge[k].u=i,edge[k].v=j,edge[k].w=dis;
}
}// 计算每个点距离,加边
sort(edge+1,edge+k+1,cmp);
int cnt=0,ans=0;
for(int i=1 ; i<=k ; i++){
int cu=find(edge[i].u),cv=find(edge[i].v);
if(cu!=cv){
fa[cu]=cv;
ans+=edge[i].w;
cnt++;
}
if(cnt==n-1)
break;
}//kruskal
if(cnt!=n-1){
cout<<-1;
return 0;
}//判断联通
cout<<ans;
return 0;
}