UVa 10369 - Arctic Network

传送门

UVa 10369 - Arctic Network

题意

有几个前哨,要联网,现在有n颗卫星,一颗卫星可以给两个岛无视距离通信!剩下的只能用无线电了,求无线电最小的距离。

思路

构建一个MST,因为是从小到大加入边,把卫星给最长的那几条边,就是求第n-k条边的权。所以只要加到第n-k条就可以输出了。

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int VMAXN = 500 + 10;
const int DMAXN = VMAXN * VMAXN >> 1;
 
struct POINT
{
    int x, y;
}pit[VMAXN];
 
int u[DMAXN], v[DMAXN], n, p[VMAXN], r[DMAXN], nsate, noutp;
double dis[DMAXN];
 
int cmp(const int i, const int j)
{
    return dis[i] < dis[j];
}
 
int Find(const int x)
{
    return p[x] == x ? x : (p[x] = Find(p[x]));
}
 
void Kruskal()
{
    int i, cnt = 0;
    for (i = 1; i <= noutp; i++)
        p[i] = i;
    for (i = 0; i < n; i++)
        r[i] = i;
    sort(r, r + n, cmp);
    for (i = 0; i < n; i++)
    {
        int e = r[i];
        int x = Find(u[e]), y = Find(v[e]);
        if (x != y)
        {
            cnt++, p[x] = y;
            if (cnt == noutp - nsate)
            {
                printf("%.2f\n", dis[e]);
                return;
            }
 
        }
    }
}
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int T, i, j, a, b;
    scanf("%d", &T);
    while (T--)
    {
        n = 0;
        scanf("%d%d", &nsate, &noutp);
        for (i = 1; i <= noutp; i++)
            scanf("%d%d", &pit[i].x, &pit[i].y);
        for (i = 1; i <= noutp; i++)
            for (j = i + 1; j <= noutp; j++)
            {
                u[n] = i, v[n] = j;
                dis[n++] = hypot(pit[i].x - pit[j].x, pit[i].y - pit[j].y);
            }
        Kruskal();
    }
    return 0;
}

Powered by Jekyll and Theme by solid