poj 2236【並查集

#include "iostream"
#include "cstring"
using namespace std;
int pre[1005];
int x[1005],y[1005],use[1005];

int findd(int x){
    int r=x;
    while(pre[r]!=r)
        r=pre[r];
    int i=x,j;
    while(i!=r){
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}

void join(int x,int y){
    int fx=findd(x),fy=findd(y);
    if(fx!=fy)
        pre[fx]=fy;
}

int dis(int i,int nub,int d){
    d=d*d;
    int xx=x[i]-x[nub],yy=y[i]-y[nub];
    if((xx*xx+yy*yy)<=d)
        return 1;
    else return 0;
}

int main(){
    int n,d,nub;
    char s;
    memset(use,0,sizeof(use));
    cin>>n>>d;
    for(int i=0;i<=n;i++)
        pre[i]=i;
    for(int i=1;i<=n;i++)
        cin>>x[i]>>y[i];
    while(cin>>s){
        if(s=='O'){
            cin>>nub;
            use[nub]=1;
            findd(nub);
            for(int i=1;i<=n;i++){
                if(use[i]==1&&i!=nub&&dis(i,nub,d))
                    join(i,nub);
            }
        }
        else if(s=='S'){
            int b,q;
            cin>>b>>q;
            if(findd(b)==findd(q))
                cout<<"SUCCESS"<<endl;
            else
                cout<<"FAIL"<<endl;
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章