前言
这也太简单了吧hh
传送门 :
思路
先计算是否有边
然后将边加入需要处理的数组里面去
跑一下最小生成树即可
CODE
struct pain{
int x,y;
}num[N];
int cal(pain a,pain b)
{
return (a.x - b.x)*(a.x-b.x) +(a.y-b.y)*(a.y-b.y);
}
struct node
{
int a,b,w;
bool operator<(const node &W)
{
return w<W.w;
}
}e[N*N];
int p[N];
int cnt;
void init()
{
for(int i=1;i<=N;i++)
p[i]=i;
}
int find(int x)
{
if(x!=p[x])return p[x] = find(p[x]);
return p[x];
}
void solve()
{
cin>>n>>m;
init();
for(int i=1;i<=n;i++)
{
cin>>num[i].x>>num[i].y;
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
int b = cal(num[i],num[j]);
if(b>=m)
{
e[++cnt] = {i,j,b};
}
}
}
sort(e+1,e+1+cnt);
int res = 0 ;
int sum_cnt = 0 ;
for(int i=1;i<=cnt;i++)
{
int a = e[i].a,b=e[i].b,w=e[i].w;
a =find(a),b=find(b);
if(a!=b)
{
sum_cnt ++;
p[a] =b;
res+=w;
}
}
if(sum_cnt !=n-1)
cout<<-1<<endl;
else
cout<<res<<endl;
}