poj 2236 并查集

来源:互联网 发布:托福报名 知乎 编辑:程序博客网 时间:2024/06/05 20:33

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=1010;
struct
{
    intx,y;
}a[maxn];
double d[maxn][maxn];
int text[maxn];

 

double calc(int t,int s)
{
    double q=a[t].x-a[s].x;
    q*=q;
    double w=a[t].y-a[s].y;
    w*=w;
    return(sqrt(q+w));
}
int f[maxn];
int find(int x)
{
   if(f[x]!=x)
   f[x]=find(f[x]);
   return(f[x]);
}

int make(int a,int b)
{
    intf1=find(a);
    intf2=find(b);
   if(f1!=f2)
   f[f2]=f1;
}

int main()
{
//   freopen("in.txt","r",stdin);
    intn,di;
    scanf("%d%d",&n,&di);
    for(inti=1;i<=n;i++)
    scanf("%d%d",&a[i].x,&a[i].y);

    for(inti=1;i<=n;i++)
    for(intj=1;j<=n;j++)
   d[i][j]=calc(i,j);
//   calc(1,2);
    chartmp[10];
    intp,q;
   memset(text,0,sizeof(text));

    for(inti=1;i<=n;i++)
    f[i]=i;

   while(scanf("%s",tmp)!=EOF)
    {
       if(tmp[0]=='O')
       {
           scanf("%d",&p);
           text[p]=1;
           for(int i=1;i<=n;i++)
           {
               if(text[i]&&d[i][p]<=di)
               make(i,p);
           }
       }
       else
       {
           scanf("%d %d",&p,&q);
           int f1=find(p);
           int f2=find(q);
           if(f1==f2)
           printf("SUCCESS\n");
           else
           printf("FAIL\n");
       }
    }
    return0;
}