poj 2236 (并查集)

#include<iostream>
#include
<cstdio>
#include
<cstring>
#include
<cmath>
#include
<cstdlib>
using namespace std;
#define MAXN 1010
int mark[MAXN];
int dis[MAXN][MAXN];
int x[MAXN],y[MAXN];
int father[MAXN];
char c[100];
int find_set(int a)
{
if(a==father[a])return a;
return father[a]=find_set(father[a]);
}
void union_set(int a,int b)
{
int ra=find_set(a);
int rb=find_set(b);
father[ra]
=rb;
}
int main()
{
int n,d,i,j,ra,rb,a,b;
scanf(
"%d%d",&n,&d);
d
=d*d;
for(i=1;i<=n;i++)
scanf(
"%d%d",&x[i],&y[i]);

for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))<=d)
dis[i][j]
=dis[j][i]=1;
for(i=1;i<=n;i++)
father[i]
=i;
while(scanf("%s",c)!=EOF)
{
if(c[0]=='O')
{
scanf(
"%d",&a);
ra
=find_set(a);
mark[a]
=1;
for(i=1;i<=n;i++)
{
rb
=find_set(i);
if(dis[a][i]==1&&rb!=ra&&mark[i]==1)
union_set(ra,rb);
}
}
else
{
scanf(
"%d%d",&a,&b);
ra
=find_set(a);
rb
=find_set(b);
if(ra!=rb)
printf(
"FAIL\n");
else
printf(
"SUCCESS\n");
}
}
return 0;
}

posted on 2011-06-10 15:02  thinking001  阅读(68)  评论(0)    收藏  举报

导航