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

http://acm.hdu.edu.cn/showproblem.php?pid=3635

并查集

改变一个点的值,同时要改变他儿子的值,用并查集实现

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

 

posted on 2012-04-27 15:24  Qiuqiqiu  阅读(146)  评论(0编辑  收藏  举报