标签:can == \n printf div std lib oid 合并
1 p q 合并p,q所在集合
2 p q 把p移动到q所在集合
3 p 查询p所在集合的元素个数
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef long long LL; 4 LL sum[200005]={0}; 5 int fa[200005]={0},ood[200005]={0},cnm[200005]={0}; 6 int n; 7 int father(int x) 8 { 9 if(x!=fa[x]) fa[x]=father(fa[x]); 10 return fa[x]; 11 } 12 void hb(int x,int y) 13 { 14 int fx=father(ood[x]),fy=father(ood[y]); 15 fa[fx]=fy; 16 sum[fy]+=sum[fx]; 17 cnm[fy]+=cnm[fx]; 18 } 19 void get(int x) 20 { 21 int fx=father(ood[x]); 22 cnm[fx]--; 23 sum[fx]-=(LL)x; 24 ood[x]=++n; 25 fa[ood[x]]=ood[x]; 26 cnm[ood[x]]=1;//不能写成"cnm[ood[x]]++",因为未对新建元素初始化 27 sum[ood[x]]=(LL)x; 28 } 29 int main() 30 { 31 int m,i,op,p,q; 32 while(scanf("%d%d",&n,&m)==2) 33 { 34 for(i=1;i<=n;i++) 35 { 36 fa[i]=ood[i]=i; 37 sum[i]=(LL)i; 38 cnm[i]=1; 39 } 40 for(;m>0;m--) 41 { 42 scanf("%d",&op); 43 if(op==1) 44 { 45 scanf("%d%d",&p,&q); 46 if(father(ood[p])!=father(ood[q])) hb(p,q); 47 } 48 if(op==2) 49 { 50 scanf("%d%d",&p,&q); 51 if(father(ood[p])!=father(ood[q])) 52 { 53 get(p); 54 hb(p,q); 55 } 56 } 57 if(op==3) 58 { 59 scanf("%d",&p); 60 printf("%d %lld\n",cnm[father(ood[p])],sum[father(ood[p])]); 61 } 62 } 63 } 64 return 0; 65 }
标签:can == \n printf div std lib oid 合并
原文地址:https://www.cnblogs.com/zytwan/p/9931173.html