http://poj.org/problem?id=2236
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int maxn=1010;
int f[maxn];
bool vis[maxn];
struct node{
int x,y;
void init(){
scanf("%d%d",&x,&y);
}
node(int x=0,int y=0):x(x),y(y){}
}pos[maxn];
int n,dis;
bool callen(node a,node b){
node tp=node(a.x-b.x,a.y-b.y);
if(tp.x*tp.x+tp.y*tp.y<=dis) return 1;
else return 0;
}
int set_find(int x){
if(f[x]<0) return x;
else return f[x]=set_find(f[x]);
}
void make_join(int a,int b){
a=set_find(a);
b=set_find(b);
if(b!=a)f[b]=a; //注意,如果没有加a!=b 会 running error!!!
}
int main()
{
// freopen("in.in","r",stdin);
scanf("%d%d",&n,&dis);
for(int i=1;i<=n;i++) pos[i].init();
memset(f,-1,sizeof(f));
memset(vis,0,sizeof(vis));
dis=dis*dis;
char s;
int a,b;
while(cin>>s){
if(s=='O'){
scanf("%d",&a);
vis[a]=1;
for(int i=1;i<=n;i++) if(i!=a)
{
if(vis[i]&&callen(pos[a],pos[i])) make_join(a,i);
}
}
else{
scanf("%d%d",&a,&b);
a=set_find(a);
b=set_find(b);
if(a==b) printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}