#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int m;
int k;
int P;
int pre[550];
double d[550];
struct post
{
double x;
double y;
}p[550];
struct node//构建临界矩阵,W代表距离权值
{
int u;
int v;
double w;
}e[250001];
int cmp(node x, node y)
{
return x.w < y.w ;
}
double get_dis(double x1,double y1,double x2,double y2)//两个炮台之间的距离,对应坐标乘积的平方根
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
void init ()//初始化所有炮台,看作各自独立
{
for(int i = 1;i<=P;i++)
{
pre[i] = i;
}
}
int find(int x)//并查集根结点
{
int r = x;
while(r != pre[r])
{
r = pre[r] ;
}
int i = r;
int j;
while(pre[i] != i)
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
bool join(int x, int y)//并查集结点合并判断
{
int f1 = find(x);
int f2 = find(y);
if(f1 != f2)
{
pre[f1] = f2;
return true;
}
return false;
}
void kruskal(int n)
{
k = 0;
double Max = 0;
for(int i=0;i<m;i++)
{
if(join(e[i].u, e[i].v))
{
d[k++] = e[i].w;
n--;
if(n == 1)
{
return ;
}
}
}
}
int main()
{
int t,S;
double x,y;
scanf("%d",&t);
while(t--)
{
m = 0;
scanf("%d%d",&S,&P);
init();
for(int i=1;i<=P;i++)
{
scanf("%lf%lf",&p[i].x, &p[i].y );
}
for(int i=1;i<P;i++)
{
for(int j=i+1;j<=P;j++)
{
e[m].u = i;
e[m].v = j;
e[m].w = get_dis(p[i].x, p[i].y, p[j].x, p[j].y );//计算出坐标间距离并存入结构体数组
e[m].u = j;
e[m].v = i;
e[m++].w = get_dis(p[i].x, p[i].y ,p[j].x ,p[j].y ); //无向图,将i,j交换实现互通
}
}
sort(e,e+m,cmp);//C++内置快速排序,按照权值降序排列
kruskal(P);
printf("%.2f\n",d[P-S-1]);
}
return 0;
}
asf
最新推荐文章于 2022-04-24 18:44:57 发布