解析:
本题十分简单,我认为不应该是一道绿题,只需要建一个完全图,然后在建边之前判断是否大于c即可。然后跑一边最小生成树,Kruskal,如果可以的话输出重量,否则输出-1即可。参考程序如下:
#include<iostream> #include<algorithm> using namespace std; int n,c,sum,a[225000],b[225001],tmp,weight,u,v,parent[225000],num,x,y; struct node { int u,v,w; }; node f[10000001]; bool cmp(node a,node b) { return a.w<b.w; } int find(int x) { if(parent[x]==x)return x; return parent[x]=find(parent[x]); } int main() { //freopen("1.in","r",stdin); cin>>n>>c; for(int i=1;i<=n;i++) { cin>>a[i]>>b[i]; } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { //cout<<"CJXGBH_____________________________________________"<<endl; if(i==j)continue; tmp=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]); if(tmp>=c) { sum++; f[sum].u=i; f[sum].v=j; f[sum].w=tmp; } } } sort(f+1,f+sum+1,cmp); for(int i=1;i<=n;i++) { parent[i]=i; } for(int i=1;i<=sum;i++) { u=f[i].u;v=f[i].v; x=find(u); y=find(v); if(x!=y) { num++; weight+=f[i].w; parent[x]=y; } if(num==n-1) { break; } } if(num==n-1)cout<<weight; else cout<<"-1"; return 0; }