POJ

题目大意:

某地发生了一次地震。ACM (Asia Cooperated Medical 亚洲联合医疗队) 已经为电脑搭建了一个无线网络。由于受到硬件的约束,每台电脑只能与距离它不超过 d 米的其它电脑直接通信。但每台电脑可被看作其它两台电脑的通信中转点,也就是说,如果电脑 A 和电脑 B 可以直接通信,或存在一台电脑 C 既可与 A 也可与 B 通信,那么电脑 A 和电脑 B 之间就能够通信。
在处理网络修复的过程中,工作人员们在任何一个时刻,可以执行两种操作:维修一台电脑,或测试两台电脑是否能够通信。请您找出全部的测试操作。

输入:
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4
输出:
FAIL
SUCCESS

 并查集模板,直接上代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

struct Point{
    int x,y;
}point[1005];

int u,v,n,d,cnt,p[1005],fix[1005];
bool vis[1005];
double GetD(int u,int v){
    int x = point[u].x - point[v].x;
    int y = point[u].y - point[v].y;
    return sqrt(1.0*x*x + 1.0*y*y);
}

int find(int x){
      return  x == p[x]? x:(p[x] = find(p[x]));
}

int main(){
    int k,cnt=0;
    scanf("%d%d",&n,&d);
    for(int i=0 ;i<= n;i++)  p[i] = i;
    for(int i=1 ;i<=n ;i++)
        scanf("%d%d",&point[i].x, &point[i].y);
    char ch[2];
    memset(vis,false,sizeof(vis));
    while (scanf("%s",ch)!=EOF)
    {
        if(ch[0] == 'O'){
            scanf("%d",&k);
            if(vis[k]) continue;
            vis[k] = true;
            fix[++cnt] = k;
            for(int i=1 ;i<cnt ;i++){
                u = fix[i];
                double t = GetD(u,k);
                if(t <= d){
                    int fu = find(u);
                    int fv = find(k);
                    p[fu] = fv;
                }
            }
        }
        else {
            scanf("%d%d",&u,&v);
            int fu = find(u);
            int fv = find(v);
            if(fu == fv) printf("SUCCESS
");
            else printf("FAIL
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wxx23-IOU/p/13574416.html