游客 Signup | Login
中文 | En

2489 - 北极网络

国家安全局希望把北极的数个前哨站用一个无线网络链接起来。为了建立网络,有两种不同的通讯技术可以使用,分别是无线电通信和卫星通信。每一个前哨站都拥有一个无线电收发器,部分前哨站额外拥有卫星通信器。

拥有卫星通信器的前哨站之间可以无视距离进行通信;而只有无线电收发器的前哨站则可以在不超过D的距离范围内进行通信,D的大小取决于收发器的功率大小。功率越高D值越大,不过消耗也就越多。出于设备购买与维护的考虑,所有前哨站的无线电收发器都是一致的,也就是所有收发器的D值都是一样的。

你的工作是确定无线电收发器所需的最小D值。

每一对前哨站之间都必须建立至少一条(直接或间接的)通信线路。


Input

数据的第一行是正整数N,代表数据的组数。
每一组测试数据的第一行为两个数S(1<=S<=100),代表卫星通信器的数量,还有P(S<P<=500),代表前哨站的数量。
其后P行,每行为一个前哨站的坐标(x,y)(x,y均为0到10000间的整数)。

Output

对于每一组测试数据,输出为一行,给出建立通信网络所需的最小的D值,精确到小数点后两位。

Examples

Input

1
2 4
0 100
0 300
0 600
150 750

Output

212.13

Solution C++

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define INF 999999.0
using namespace std;

struct Outpost{
    int x, y;
}O[501];
int cmp(double a, double b){
    return a > b;
}
int s, p;
double dist[501][501], d[501];
char vis[501];
void prim(){
    int i, j, k, mini, minj;
    double min;
    vis[1] = mini = 1;
    for(i = 1; i <= p; i++){
        min = INF;
        for(j = 1; j <= p; j++){
            if(!vis[j]){
                if(dist[mini][j] < d[j]){
                    d[j] = dist[mini][j];
                }
                if(d[j] < min){
                    min = d[j];
                    minj = j;
                }
            }
        }
        mini = minj;
        vis[mini] = 1;
    }
}
int main(){
    int k, i, j, x, y;
    scanf("%d", &k);
    while(k--){
        scanf("%d%d", &s, &p);
        memset(vis, 0, sizeof(vis));
        memset(O, 0, sizeof(O));
        for(i = 1; i <= p; i++){
            scanf("%d%d", &O[i].x, &O[i].y);
            d[i] = INF;
        }
        for(i = 1; i <= p; i++){
            for(j = 1; j <= i; j++){
                x = O[i].x-O[j].x;
                y = O[i].y-O[j].y;
                dist[i][j] = dist[j][i] = sqrt(x*x + y*y);
            }
        }
        prim();
        sort(d+1, d+p+1);
        printf("%.2f\n", d[p-s]);
    }
    return 0;
}
Time Limit 2 seconds
Memory Limit 128 MB
Discuss Stats
上一题 下一题