简单并查集 这题WA了20几次 相当无语 写了半小时 找错找了2小时 就因为输入用的字符而不是字符串 真无语 做poj要相当细心啊
相当小心啊
还有一点注意一下 N是1001 刚开始我直接开的1001
将已经修好的距离可达到的电脑合并为一个集合 比较两个节点的根节点是否相同就是

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<math.h> 4 int father[1010], deep[1010]; 5 int find(int u) 6 { 7 if(u!=father[u]) 8 { 9 father[u] = find(father[u]); 10 } 11 return father[u]; 12 } 13 void union1(int q, int p) 14 { 15 q = find(q); 16 p = find(p); 17 if(q!=p) 18 { 19 if(deep[q]>deep[p]) 20 { 21 father[p] = q; 22 } 23 else 24 { 25 if(deep[q] == deep[p]) 26 deep[p]++; 27 father[q] = p; 28 } 29 } 30 } 31 int main() 32 { 33 int n, d, x[1010],y[1010],f[1010], i, j,a,b,flag=0,xi,yi; 34 char s[10]; 35 long long v; 36 scanf("%d%d", &n, &d); 37 for(i = 1 ; i <= n ; i++) 38 { 39 father[i] = i; 40 deep[i] = 0; 41 f[i] = 0; 42 } 43 for(i = 1 ;i <= n ; i++) 44 { 45 scanf("%d%d", &x[i], &y[i]); 46 } 47 while(scanf("%s", s)!=EOF) 48 { 49 if(s[0] == 'O') 50 { 51 scanf("%d", &b); 52 f[b] = 1; 53 for(i = 1 ; i <= n ; i++) 54 { 55 v = (x[i]-x[b])*(x[i]-x[b])+(y[i]-y[b])*(y[i]-y[b]); 56 if(f[i] == 1 &&v<=d*d&&i!=b) 57 { 58 union1(i, b); 59 } 60 } 61 } 62 else 63 { 64 scanf("%d %d", &xi, &yi); 65 if(find(xi) == find(yi)) 66 printf("SUCCESS\n"); 67 else 68 printf("FAIL\n"); 69 } 70 } 71 return 0; 72 }