70pts , 不知道是精度出了问题还是别的地方出了问题
查看原帖
70pts , 不知道是精度出了问题还是别的地方出了问题
462047
jimmyfj楼主2023/1/5 22:45
#include <bits/stdc++.h>
#define long long int
using namespace std;

struct node {
    int b, e;
    double s;
}dis[200005];

int n, m;
double ans;
int s, side;
int f[50005];
int spot_x[50005];
int spot_y[50005];

bool cmp(node a, node b) {
    return a.s < b.s;
}

int find(int x) {
    if (x == f[x]) return x;
    return f[x] = find(f[x]);
}

void kruskal() {
    for (int i = 1; i <= side; i ++) {
        int x = find(dis[i].b);
        int y = find(dis[i].e);
        if (x == y) {
            continue;
        }
        f[y] = x;
        ans += dis[i].s;
        s ++;
        if (s == n - 1) {
            break;
        }
    }
}

signed main () {
    cin >> n >> m;
    for (int i = 1 ;i <= n; i ++) {
        f[i] = i;
    }
    for (int i = 1; i <= n; i ++) {
        cin >> spot_x[i] >> spot_y[i];
    }
    for (int i = 1; i <= n; i ++) {
        for (int j = i + 1; j <= n; j ++) {
            double sum = sqrt(double((spot_x[i] - spot_x[j])) * double((spot_x[i] - spot_x[j])) + double((spot_y[i] - spot_y[j])) * double((spot_y[i] - spot_y[j])));
            side ++;
            dis[side].b = i, dis[side].e = j, dis[side].s = sum;
        }
    }
    for (int i = 1; i <= m; i ++) {
        int x, y;
        cin >> x >> y;
        side ++;
        dis[side].b = x, dis[side].e = y, dis[side].s = 0;
    }
    sort(dis + 1, dis + side + 1, cmp);
    kruskal();
    printf("%.2lf\n", ans);
    return 0;
}
2023/1/5 22:45
加载中...