东调英G
查看原帖
东调英G
1496645
BenRenglz楼主2025/7/24 18:04

kruskal50分求调

#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
using namespace std;
long long n, k, dis[1005], sum, dsu[1005], x[1005], y[1005];
struct node
{
    long long u, v;
    double w;
    bool operator<(const node & nd) const
    {
        return w < nd.w;
    }
};
vector <node> sides;
long long find(long long u)
{
    if (dsu[u] == u)
    {
        return u;
    }
    dsu[u] = find(dsu[u]);
    return dsu[u];
}
double kruskal(long long s)
{
    long long c = n;
    for (int i = 0; i < sides.size(); i++)
    {
        auto [u, v, w] = sides[i];
        if (find(u) != find(v))
        {
            c--;
            dsu[find(u)] = find(v);
        }
        if (c == k)
        {
            return sides[i+1].w;
        }
    }
}
int main()
{
    cin >> n >> k;
    for (long long i = 1; i <= n; i++)
    {
        cin >> x[i] >> y[i];
        dsu[i] = i;
    }
    for (long long i = 1; i <= n; i++)
    {
        for (long long j = 1; j < i; j++)
        {
            sides.push_back({i, j, sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))});
        }
    }
    sort(sides.begin(), sides.end());
    cout << fixed << setprecision(2) << kruskal(1)+1e-10;
    return 0;
}``````
2025/7/24 18:04
加载中...