poj2236 Wireless Network (并查集)

一张图上分布着n台坏了的电脑,并知道它们的坐标。两台修好的电脑如果距离<=d就可以联网,也可以通过其他修好的电脑间接相连。给出操作“O x”表示修好x,给出操作“S x y”,请你判断x和y在此时有没有连接上。

 

#include <iostream>
#include <cstring>

using namespace std;

int f[1010],x[1010],y[1010],vis[1010];
int n,d,l,r;
char ch;

void init(){
    for(int i=0;i<=n;i++)
    f[i]=i;
}

int find(int i){
    if(i!=f[i]) f[i]=find(f[i]);
    return f[i];
}

bool dis(int a,int b){
    int q=x[a]-x[b];
    int p=y[a]-y[b];
    if(q*q+p*p<=d*d) return true;
    return false;
}

int main()
{
    cin>>n>>d;
    init();
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i];
    }
    while(cin>>ch){
        if(ch=='O'){
           cin>>r;
           vis[r]=1;
           for(int i=1;i<=n;i++){
            if(i!=r&&vis[i]&&dis(i,r)){
                int k1=find(r);
                int k2=find(i);
                f[k1]=k2;
            }
           }
        }
        else if(ch=='S'){
            cin>>l>>r;
            int k1=find(l);
            int k2=find(r);
            if(k1==k2) cout<<"SUCCESS"<<endl;
            else cout<<"FAIL"<<endl;
        }
    }
    return 0;
}

 

posted @ 2018-08-01 16:27  Somnus、M  阅读(154)  评论(0编辑  收藏  举报