大佬们,50分wa求助
查看原帖
大佬们,50分wa求助
191072
WilliamH楼主2021/3/12 20:02

Rt

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

int n, k;
double ans;
vector<pair<int, int> > spot;

struct DSU
{
    vector<int> fa;
    DSU(int n)
    {
        fa = vector<int>(n + 1);
        for (int i = 0; i <= n; i++)
            fa[i] = i;
    }
    int getRoot(int x)
    {
        return fa[x] == x ? x : fa[x] = getRoot(fa[x]);
    }
    void merge(int x, int y)
    {
        fa[getRoot(x)] = getRoot(y);
    }
    bool same(int x, int y)
    {
        return getRoot(x) == getRoot(y);
    }
};

struct Edge{
    int u, v;
    double w;
    bool operator < (const Edge & other)const
    {
        return w < other.w;
    }
};
vector<Edge> edges;
vector<Edge> edges2;

void init(int n)
{
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++){
            double a = spot[i].first - spot[j].first, b = spot[i].second - spot[j].second;
            double dis = sqrt(a * a + b * b);
            edges.push_back({i, j, dis});
//            printf("%d %d %lf\n", edges[edges.size() - 1].u, edges[edges.size() - 1].v, edges[edges.size() - 1].w);
        }
}

int main()
{
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++){
        int x, y;
        scanf("%d %d", &x, &y);
        spot.push_back(make_pair(x, y));
    }
    init(n);
//    puts("----");
    
    sort(edges.begin(), edges.end());
    DSU dsu(n);
    for (int i = 0; i < edges.size(); i++)
        if (!dsu.same(edges[i].u, edges[i].v)){
//            printf("%d %d %lf\n", edges[i].u, edges[i].v, edges[i].w);
            dsu.merge(edges[i].u, edges[i].v);
            edges2.push_back(edges[i]);
            n--;
            if(n == k){
                printf("%.2f\n", edges[i + 1].w);
                break;
            }
        }
    return 0;
 } 
2021/3/12 20:02
加载中...