POJ - 2236
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6
7 int n,d;
8 char c;
9 int p,q;
10 int book[1005]={0},f[1005]; //分别是 标记是否修好 , 找爸
11
12 struct note
13 {
14 int x,y;
15 }a[1005]; //记录坐标
16
17 int getf(int u)
18 {
19 return u==f[u]? u:getf(f[u]);
20 }
21
22 void merge(int x,int y)
23 {
24 x=getf(x);
25 y=getf(y);
26 if(x!=y)
27 {
28 f[y]=x;
29 }
30 }
31
32 int main()
33 {
34 cin>>n>>d;
35 for(int i=1;i<=n;i++)
36 {
37 f[i]=i;
38 cin>>a[i].x>>a[i].y;
39 }
40 while(cin>>c)
41 {
42 if(c=='O') //修
43 {
44 cin>>p;
45 book[p]=1; //修好了 ,下面进行寻找
46 for(int i=1;i<=n;i++)
47 {
48 //第i个电脑不和第p的电脑超出距离,并且第i个电脑已经被修好 是能连通的基本条件
49 if( d*d >= 1.0*((a[p].x-a[i].x)*(a[p].x-a[i].x)+(a[p].y-a[i].y)*(a[p].y-a[i].y)) && book[i]==1)
50 merge(f[p],f[i]); //这里左右位置不要变,要一直都把电脑p作为爸爸
51 }
52 }
53 else if(c=='S')
54 {
55 cin>>p>>q;
56 if(getf(p)==getf(q))
57 cout<<"SUCCESS"<<endl;
58 else
59 cout<<"FAIL"<<endl;
60 }
61 }
62 }