POJ 1988 解答

这道题是一道并查集的应用。计算上从上往下算,是读了他人的文章才知道的,罪过罪过。

总的来说,可以让合并的两点x和y分别做parent,这样对应向上计算和向下计算两种方法。我们只用一种。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int count=0;
 4 int p[30005];
 5 int num[30005];
 6 int up[30005];
 7 
 8 int find_set(int x);
 9 void link(int x,int y);
10 void make_set(int x)
11 {
12      p[x] = x;
13      num[x] = 1;
14          up[x] = 0;
15 }
16 
17 void Union(int x, int y)
18 {
19        if (x == y)
20              return;
21          x = find_set(x);
22          y = find_set(y);
23          p[y] = x;
24          up[y] += num[x];
25           num[x] += num[y];     
26          
27 }
28 
29 int find_set(int x)
30 {
31     if (x != p[x])
32     {
33                     int t = p[x];
34           p[x] = find_set(p[x]);
35                     up[x] += up[t];
36     }
37     return p[x];
38 }
39  
40 int main()
41 {
42     int P;
43     int i,j;
44     scanf("%d",&P);
45     char Ops;
46     int x,y;
47     for(i=1;i<=30004;i++)
48         make_set(i);
49     while(P)
50     {
51         getchar();
52         scanf("%c",&Ops);
53         if(Ops == 'M')
54         {
55             scanf("%d %d",&x, &y);
56             Union(x,y);
57 
58         }
59         else if(Ops == 'C')
60         {
61             scanf("%d",&x);
62             int temp = find_set(x);
63             printf("%d\n",num[temp] - up[x] - 1);
64         }
65   P--;
66     }
67     system("pause");
68     return 0;
69 }

 

posted @ 2012-08-20 21:29  心似飞鸿  阅读(174)  评论(0)    收藏  举报