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 }

 

你可能感兴趣的:(poj)