根据题意 需要将所有点联通 但是有M个卫星通信装置 所以可以省去M-1条边,先使用Kruskal跑最小生成树
即第k长的边,那么这个问题就解决了
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 510;
struct note
{
int u,v;double w;
}e[N*N];
double x[N],y[N];
int f[N];
int n,s,p;
bool cmp(note a,note b){return a.w<b.w;}
int find(int x){return f[x]==x?x:find(f[x]);}
void Kruskal()
{
for(int i=0;i<=p;i++) f[i]=i;
int cnt=0;
for(int i=0;i<n;i++)
{
int x=find(e[i].u);
int y=find(e[i].v);
if(x!=y)
{
cnt++;
f[x]=y;
}
if(cnt==p-s)
{
printf("%.2f\n",e[i].w);
break;
}
}
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
scanf("%d%d",&s,&p);
for(int i=0;i<p;i++) scanf("%lf%lf",&x[i],&y[i]);
n=0;
for(int i=0;i<p;i++)
for(int j=0;j<i;j++)
{
e[n].u=i;
e[n].v=j;
e[n++].w=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
sort(e,e+n,cmp);
Kruskal();
}
return 0;
}