哪里有问题呢?
查看原帖
哪里有问题呢?
550865
牛子123楼主2022/5/19 20:06
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010, M = N * N, INF = 0x3f3f3f3f;

int n, m, k, p[N];
double x[N], y[N];
// WLP分成的列数0-N和信号塔个数
struct Edge
{
    int a, b;
    double e;

    bool operator < (const Edge & E) const{
        return e < E.e;
    }
}edges[M];

double cal(int a, int b)
{
    return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}

int Find(int x)
{
    if(x != p[x]) p[x] = Find(p[x]);

    return p[x];
}

int main()
{
    cin >> n >> m;
    // n 是共有几列, m 是防御塔的个数
    
    for(int i = 1; i <= m; i ++)
    {
        cin >> x[i] >> y[i];
    }

    for(int i = 0; i <= m + 1; i ++) p[i] = i;

    for(int i = 1; i <= m; i ++)
    {
        for(int j = i + 1; j <= m; j ++)
        {
            edges[++ k] = {i, j, cal(i, j) / 2};
        }
    }

    for(int i = 1; i <= m; i ++)
    {
        edges[++ k] = {0, i, (x[i] + 1)};
        edges[++ k] = {m + 1, i, (n + 1 - x[i])};
    }

    sort(edges + 1, edges + 1 + k);

    for(int i = 1; i <= k; i ++)
    {
        double e = edges[i].e;
        int a = edges[i].a, b = edges[i].b;
        
        int x = Find(a);
        int y = Find(b);

        if(x != y) 
        {
            p[x] = y;
            if(p[m + 1] == p[0])
            {
                printf("%.2lf\n", e);
                break;
            }
        }
    }

    return 0;
}   

2022/5/19 20:06
加载中...