1 条题解

  • 0
    @ 2025-4-5 11:30:35
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1000;
    int n, k;
    int x[MAXN + 5], y[MAXN + 5];
    struct Edge
    {
        int u, v, w; // w存距离的平方、减少开方运算的次数
    };
    vector<Edge> e;
    bool cmp(Edge x, Edge y)
    {
        return x.w < y.w;
    }
    int fa[MAXN + 5];
    int findFa(int x)
    {
        if (x == fa[x])
            return x;
        return fa[x] = findFa(fa[x]);
    }
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> k;
        for (int i = 1; i <= n; i++)
            cin >> x[i] >> y[i];
    
        for (int i = 1; i <= n; i++)
            for (int j = i + 1; j <= n; j++)
            {
                int len = (x[i] - x[j]) * (x[i] - x[j]) +
                          (y[i] - y[j]) * (y[i] - y[j]);
                e.push_back({i, j, len});
            }
        sort(e.begin(), e.end(), cmp);
        for (int i = 1; i <= n; i++)
            fa[i] = i;
    
        int num = n; // 连通块数量
        int ans = 0;
        for (int i = 0; i <= (int)e.size() - 1; i++)
        {
            int u = e[i].u, v = e[i].v, w = e[i].w;
            int faU = findFa(u);
            int faV = findFa(v);
            if (faU == faV)
                continue;
            fa[faU] = faV;
            num--;
            if (num == k - 1)
            {
                ans = w;
                break;
            }
        }
    
        cout << fixed << setprecision(2) << sqrt(ans);
        return 0;
    }
    
    • 1

    信息

    ID
    4768
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    19
    已通过
    11
    上传者