123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include <cmath>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- using namespace std;
- const int S = 100;
- const int P = 500;
- struct V {
- int x;
- int y;
- V(int x = 0, int y = 0) : x(x), y(y) {}
- double operator-(const V &that) const {
- double dx = this->x - that.x;
- double dy = this->y - that.y;
- return sqrt(dx * dx + dy * dy);
- }
- } outpost[P];
- struct E {
- int u;
- int v;
- double len;
- E(int u, int v, double len) : u(u), v(v), len(len) {}
- bool operator<(const E &that) const { return this->len > that.len; }
- };
- struct UF {
- int id[P];
- int sz[P];
- int cnt;
- } uf;
- int find(int i) {
- if (i == uf.id[i]) return i;
- int j = find(uf.id[i]);
- uf.id[i] = j;
- return j;
- }
- void unite(int i, int j) {
- i = find(i);
- j = find(j);
- if (i == j) return;
- if (uf.sz[i] < uf.sz[j]) {
- uf.id[i] = j;
- } else {
- if (uf.sz[i] == uf.sz[j]) uf.sz[i]++;
- uf.id[j] = i;
- }
- uf.cnt--;
- }
- int main() {
- int n, s, p, k;
- scanf("%d", &n);
- while (n--) {
- scanf("%d %d", &s, &p);
- for (int i = 0; i < p; i++) {
- scanf("%d %d", &outpost[i].x, &outpost[i].y);
- uf.id[i] = i;
- }
- memset(uf.sz, 0, sizeof(uf.sz));
- uf.cnt = p, k = 0;
- priority_queue<E> pq;
- for (int i = 0; i < p - 1; i++)
- for (int j = i + 1; j < p; j++) pq.push(E(i, j, outpost[i] - outpost[j]));
- double d = 0.;
- while (1 < uf.cnt) {
- E e = pq.top(); // No const E & !!! WA * 4
- pq.pop();
- if (find(e.u) == find(e.v)) continue;
- unite(e.u, e.v);
- if (++k == p - s) {
- d = e.len;
- break;
- }
- }
- printf("%.2f\n", d);
- }
- return 0;
- }
|