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;
}``````