Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

并查集
up记录x上面的个数,sum记录总数

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N=30010;
 6 int set[N],up[N],sum[N];
 7 int find(int x)
 8 {
 9     if(x==set[x]) return x;
10     int t=find(set[x]);
11     up[x]+=up[set[x]];
12     return set[x]=t;
13 }
14 int main()
15 {
16     int P;
17     while(~scanf("%d",&P))
18     {
19         for(int i=0;i<N;i++)
20         {
21             set[i]=i;
22             sum[i]=1;
23             up[i]=0;
24         }
25         while(P--)
26         {
27             char op[2];
28             scanf("%s",op);
29             if(op[0]=='M')
30             {
31                 int x,y;
32                 scanf("%d%d",&x,&y);
33                 int fx=find(x), fy=find(y);
34                 if(fx==fy) continue;
35                 set[fy]=fx;
36                 up[fy]=sum[fx];
37                 sum[fx]+=sum[fy];
38             }
39             if(op[0]=='C')
40             {
41                 int x;
42                 scanf("%d",&x);
43                 int fx=find(x);
44                 printf("%d\n",sum[fx]-up[x]-1);
45             }
46         }
47     }
48     return 0;
49 }

 

 

 

 

posted on 2012-06-27 11:14  Qiuqiqiu  阅读(196)  评论(1编辑  收藏  举报