阅读背景:

[一本通学习笔记] 最小生成树

来源:互联网 

10065. 「一本通 3.1 例 2」北极通讯网络

#include <bits/stdc++.h>
using namespace std;

const int N = 500005;
int fa[N], n, k, ind;
double x[N], y[N];
void init() {
    for (int i = 0; i <= n; i++) fa[i] = i;
}
int find(int p) { return (p == fa[p]) ? (p) : (fa[p] = find(fa[p])); }
void merge(int p, int q) {
    p = find(p);
    q = find(q);
    fa[p] = q;
}
double dist(double x1, double y1, double x2, double y2) {
    return sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2));
}
struct Edge {
    int u, v;
    double w;
    bool operator<(const Edge &b) { return w < b.w; }
} e[N];
double ans = 0;
int cnt = 0;

int main() {
    // ios::sync_with_stdio(false);
    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 = 1; j < i; j++) {
            Edge tmp;
            tmp.u = i;
            tmp.v = j;
            tmp.w = dist(x[i], y[i], x[j], y[j]);
            e[++ind] = tmp;
        }
    }
    sort(e + 1, e + ind + 1);
    init();
    for (int i = 1; i <= ind; i++)
        if (find(e[i].u) != find(e[i].v)) {
            merge(e[i].u, e[i].v);
            ++cnt;
            if (cnt + k <= n)
                ans = max(ans, e[i].w);
        }
    cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;
}#include <bits/stdc



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: