刷题——Wireless Network POJ - 2236

/*
有n台电脑,电脑之间的最大通讯距离是d,电脑可以通过其它电脑通讯
现在每一台电脑都是坏的,给定每台电脑的位置
现在有两种操作
O p修复p电脑
S p q回答p q是否能够通讯
用并查集来做,将与修复好的电脑有通讯的电脑连接到一起
回答时查找一下就好
*/
#include
#include
#define pow(a,b,c,d) (a-b)*(a-b)+(c-d)*(c-d)
int n,d;
bool use[1050];
int rt[1050];
int xi[1050],yi[1050];
bool dist(int i,int p){
    if(pow(xi[i],xi[p],yi[i],yi[p])<=d*d){
        return true;
    }
    return false;
}
int find(int x){
    if(x!=rt[x]){
        rt[x]=find(rt[x]);
    }
    return rt[x];
}
void un(int i,int p){
    i=find(i);
    p=find(p);
    rt[i]=p;
}
void repair(int p){
    for(int i=1;i<=n;i++){
        if(use[i]){
            if(dist(i,p)){
                un(i,p);
            }
        }
    }
    use[p]=true;
}
int main(){
    while(~scanf("%d %d",&n,&d)){
        memset(use,false,sizeof(use));
        for(int i=1;i<=n;i++){
            scanf("%d %d",&xi[i],&yi[i]);
            rt[i]=i;
        }
        char op[2];
        int p,q;
        while(~scanf("%s",op)){
            if(op[0]=='O'){
                scanf("%d",&p);
                repair(p);
            }
            else{
                scanf("%d %d",&p,&q);
                if(find(p)!=find(q)){
                    printf("FAIL\n");
                }
                else{
                    printf("SUCCESS\n");
                }
            }
        }
    }
    return 0;
}

你可能感兴趣的:(刷题,poj,并查集)