poj2349

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/82428913