UVA11987 Almost Union-Find
Posted zytwan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA11987 Almost Union-Find相关的知识,希望对你有一定的参考价值。
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 ",cnm[father(ood[p])],sum[father(ood[p])]); 61 } 62 } 63 } 64 return 0; 65 }
以上是关于UVA11987 Almost Union-Find的主要内容,如果未能解决你的问题,请参考以下文章
UVa 11987 Almost Union-Find(支持删除操作的并查集)