#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std ;
const double INF = 1000000000;
const int N = 550;
int n ,sum;
bool vis[N] ;
double cost[N][N] ;
double lowc[N] ;
double dist[N] ;
struct Node{
double x, y ;
}MAP[N];
double Dis(Node a , Node b){
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y-b.y)*(a.y-b.y)) ;
}
void init(){
double temp ;
for(int i = 1 ; i <= n ; i ++)
cost[i][i] = INF ;
for(int i = 1 ; i <= n ; i ++){
for(int j = i+1 ; j <= n ; j ++){
temp = Dis(MAP[i] , MAP[j]) ;
cost[i][j] = cost[j][i] = temp;
}
}
}
void Prime(){
int cnt = 0 ;
memset(vis , false , sizeof(vis)) ;
vis[1] = true ;
for(int i = 1 ; i <= n ; i ++){
lowc[i] = cost[1][i] ;
}
lowc[1] = 0 ;
for(int i = 1 ; i < n ; i ++){
double minc = INF ;
int p = -1 ;
for(int j = 1 ; j <= n ; j ++){
if(!vis[j] && minc > lowc[j]){
minc = lowc[j] ;
p = j ;
}
}
vis[p] = true ;
dist[cnt ++] = minc ;
for(int j = 1 ; j <= n ; j ++){
if(lowc[j] > cost[p][j]){
lowc[j] = cost[p][j] ;
}
}
}
sort(dist , dist + cnt) ;
printf("%.2f\n",dist[cnt - sum]) ;
}
int main(){
int T ;
scanf("%d" , &T) ;
while(T --){
scanf("%d%d" ,&sum , &n) ;
for(int i = 1 ; i <= n ; i ++){
scanf("%lf%lf" , &MAP[i].x , &MAP[i].y) ;
}
init() ;
Prime() ;
}
return 0;
}
poj2349
猜你喜欢
转载自blog.csdn.net/qq_38759433/article/details/82428913
今日推荐
周排行