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) 收藏 举报
浙公网安备 33010602011771号