POJ 2236 Wireless Network 并查集

裸的并查集问题,我是用的可行数组存的,至于哈希表和坐标离散化之类的方法也可以优化吧
//164K	954MS
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

struct Point{
    int x, y;
};

Point a[1001+5];
int par[1001+5];
int well[1001+5];
int N, d, cnt;

inline int squdis(Point p1, Point p2){
    return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
}

void init(){
    for(int i=1; i<=N; i++)
        par[i] = i;
}

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

inline void bing(int x, int y){
    int px = find(x);
    int py = find(y);
    if(px != py) par[px] = py;
}

inline bool same(int x, int y){
    return find(x) == find(y);
}

int main(){
    while(~scanf("%d %d", &N, &d)){
        for(int i=1; i<=N; i++)
            scanf("%d %d", &a[i].x, &a[i].y);
        char str[2];
        int p, q;
        init();
        cnt = 1;
        while(~scanf("%s", str)){
            if(str[0] == 'O'){
              scanf("%d", &p);
              well[cnt++] = p;
              for(int i=1; i<cnt; i++){
                if(squdis(a[well[i]], a[p]) <= d*d){
                    bing(well[i], p);
                }
              }
            }
            else{
                scanf("%d %d", &p, &q);
                if(same(p, q)) puts("SUCCESS");
                else puts("FAIL");
            }
        }
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值