http://acm.hdu.edu.cn/showproblem.php?pid=3635
并查集
改变一个点的值,同时要改变他儿子的值,用并查集实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }