八中生成树1
//这个代码先算出所有点的距离,然后在求MST中只选用两点距离>=限制值的边。
#include<bits/stdc++.h> using namespace std; int ans,n,j=0,c; int g[2501][2501]; int x[2501],y[2501]; struct bobo {int a,b;} last[101]; void mst() { int lost[2501],min,s=0; int mini; bool b[2501]; memset(b,1,sizeof(b)); for(int i=2; i<=n; i++) lost[i]=INT_MAX; lost[1]=0; while(true) { min=INT_MAX; for(int i=1; i<=n; i++) if(b[i]&&lost[i]<min) { min=lost[i]; mini=i; } if(min==INT_MAX) break; j++; b[mini]=false; s+=min; for(int i=1; i<=n; i++) if(b[i]&&g[mini][i]<lost[i]&&g[mini][i]>=c) lost[i]=g[mini][i]; } if(n!=j) { cout<<"-1"<<endl; } else printf("%d",s); } int main() { cin>>n>>c; for(int i=1; i<=n; i++) cin>>x[i]>>y[i]; for(int i=1; i<=n-1; i++) for(int j=i+1; j<=n; j++) { g[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); g[j][i]=g[i][j]; } mst(); return 0; }