poj2236

简单并查集 这题WA了20几次 相当无语 写了半小时 找错找了2小时 就因为输入用的字符而不是字符串 真无语 做poj要相当细心啊

相当小心啊

还有一点注意一下 N是1001  刚开始我直接开的1001

将已经修好的距离可达到的电脑合并为一个集合 比较两个节点的根节点是否相同就是

View Code
 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 }

 

posted @ 2012-07-07 01:52  _雨  阅读(177)  评论(0编辑  收藏  举报