码迷,mamicode.com
首页 > Web开发 > 详细

Wireless Network(POJ-2236)(并查集)

时间:2015-04-22 18:13:52      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:acm   poj   

由于查询次数可能很多,相互关联的电脑也可能很多,而各个电脑之间的关系只有合并关系和查询,符合并查集的特点。

并查集更偏模板一点,没有什么思维难度,只要把握好需要使用并查集的条件就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
int n,d,vis[1111],rankk[1010],par[1020];
struct point {
    int x,y;
    point(int x = 0,int y = 0) : x(x),y(y) {}
    bool operator < (const point& r) const { return x<r.x || x==r.x && y<r.y; }
} a[1111];
void init(int n) {
    for(int i=1;i<=n;i++) {
        par[i] = i;
        rankk[i] = 0;
    }
}
int findd(int x) {
    return par[x]==x ? x : par[x] = findd(par[x]);
}
void unite(int x,int y) {
    x = findd(x);
    y = findd(y);
    if(x==y) return ;
    if(rankk[x]<rankk[y]) {
        par[x] = y;
    } else {
        par[y] = x;
        if(rankk[x] == rankk[y]) rankk[x]++;
    }
}
bool same(int x,int y) {
    return findd(x) == findd(y);
}
int main() {
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&a[i].x,&a[i].y);
    }
    char s[10];
    init(n);
    int b,c;
    while(scanf("%s",s)!=EOF) {
        if(s[0]=='O') {
            scanf("%d",&b);
            vis[b] = 1;
            for(int i=1;i<=n;i++) {
                if(vis[i]&&i!=b) {
                    int dd = (a[i].x-a[b].x)*(a[i].x-a[b].x)+(a[i].y-a[b].y)*(a[i].y-a[b].y);
                    if(dd<=(d*d)) unite(b,i);
                }
            }
        }
        else {
            scanf("%d%d",&b,&c);
            if(same(b,c)) printf("SUCCESS\n");
            else printf("FAIL\n");
        }
    }
    return 0;
}


Wireless Network(POJ-2236)(并查集)

标签:acm   poj   

原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/45197559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!