解析:
本题十分简单,我认为不应该是一道绿题,只需要建一个完全图,然后在建边之前判断是否大于c即可。然后跑一边最小生成树,Kruskal,如果可以的话输出重量,否则输出-1即可。参考程序如下:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n,c,sum,a[225000],b[225001],tmp,weight,u,v,parent[225000],num,x,y; 5 struct node 6 { 7 int u,v,w; 8 }; 9 node f[10000001]; 10 bool cmp(node a,node b) 11 { 12 return a.w<b.w; 13 } 14 int find(int x) 15 { 16 if(parent[x]==x)return x; 17 return parent[x]=find(parent[x]); 18 } 19 int main() 20 { 21 //freopen("1.in","r",stdin); 22 cin>>n>>c; 23 for(int i=1;i<=n;i++) 24 { 25 cin>>a[i]>>b[i]; 26 } 27 for(int i=1;i<=n;i++) 28 { 29 for(int j=1;j<i;j++) 30 { 31 //cout<<"CJXGBH_____________________________________________"<<endl; 32 if(i==j)continue; 33 tmp=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]); 34 if(tmp>=c) 35 { 36 sum++; 37 f[sum].u=i; 38 f[sum].v=j; 39 f[sum].w=tmp; 40 } 41 } 42 } 43 sort(f+1,f+sum+1,cmp); 44 for(int i=1;i<=n;i++) 45 { 46 parent[i]=i; 47 } 48 for(int i=1;i<=sum;i++) 49 { 50 u=f[i].u;v=f[i].v; 51 x=find(u); 52 y=find(v); 53 if(x!=y) 54 { 55 num++; 56 weight+=f[i].w; 57 parent[x]=y; 58 } 59 if(num==n-1) 60 { 61 break; 62 } 63 } 64 if(num==n-1)cout<<weight; 65 else cout<<"-1"; 66 return 0; 67 }