1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <bits/stdc++.h> using namespace std; const int maxn = 5e2 + 50, inf = 0x3f3f3f3f; int n, s; int d[maxn], a[maxn][maxn]; bool v[maxn];
struct node { int x, y; } p[maxn];
int f(int i, int j) { int x1 = p[i].x, x2 = p[j].x, y1 = p[i].y, y2 = p[j].y; return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); }
void init() { cin >> s >> n; for (int x, y, i = 1; i <= n; ++i) { cin >> x >> y; p[i].x = x, p[i].y = y; } for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (i == j) a[i][j] = 0x3f3f3f3f; else a[i][j] = a[i][j] = f(i, j); }
void prim() { memset(v, 0, sizeof(v)), memset(d, 0x3f, sizeof(d)); d[1] = 0; for (int k = 1; k < n; ++k) { int x = 0; for (int i = 1; i <= n; ++i) if (!v[i] && (!x || d[x] > d[i])) x = i; v[x] = 1; for (int y = 1; y <= n; ++y) if (!v[y] && d[y] > a[x][y]) { d[y] = a[x][y]; } } sort(d + 1, d + 1 + n); cout << fixed << setprecision(2) << sqrt(d[n - s + 1]) << endl; }
int main() { int t; cin >> t; while (t--) init(), prim(); return 0; }
|