POJ 2236 - Wireless Network

Advanced Data Structures :: Disjoint Set


Description

有个无线网络,网络里的主机只要在一定距离内就可以互相通讯,

只要主机开启,主机间的通讯可以任意传递。

刚开始,假设网络中的主机都是关闭着的。

现在会进行一些操作,这些操作会将一些主机打开,

或者询问你两台主机之间能否通讯。

对于每个询问,输出询问的结果。


Type

Advanced Data Structures :: Disjoint Set


Analysis

利用并查集。

每次开启一台主机,就暴力一下所有在他范围内,

且打开的主机,然后将他们并起来即可。


Solution

// POJ 2236
// Wireless Network
// by A Code Rabbit

#include <cmath>
#include <cstdio>
#include <cstring>

template <typename T>
struct Point {
    T x, y;
    static double GetDistance(Point a, Point b) { 
        return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)); 
    } 
};

const int MAXN = 1003;

struct DisjointSet {
    int p[MAXN];
    void Init(int);
    void Make(int x) { p[x] = x; }
    int Find(int x) { return p[x] == x ? x : p[x] = Find(p[x]); }
    int Union(int x, int y) { p[Find(x)] = Find(y); }
};

void DisjointSet::Init(int n) {
    for (int i = 1; i <= n; i++)
        Make(i);
}

int n, d;
char ch;
int p, q;
Point<int> pt[MAXN];
bool bo[MAXN];
DisjointSet set;

int main() {
    scanf("%d%d", &n, &d);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &pt[i].x, &pt[i].y);
    memset(bo, false, sizeof(bo));
    set.Init(n);
    while (1) {
        getchar();
        if ((ch = getchar()) == EOF) break;
        if (ch == 'O') {
            scanf("%d", &p);
            for (int i = 1; i <= n; i++)
                if (bo[i] && Point<int>::GetDistance(pt[p], pt[i]) <= d)
                    set.Union(p, i);
            bo[p] = true;
        } else {
            scanf("%d%d", &p, &q);
            puts(set.Find(p) == set.Find(q) ? "SUCCESS" : "FAIL");
        }
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值