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的主要内容,如果未能解决你的问题,请参考以下文章

UVA11987 Almost Union-Find

UVA11987 Almost Union-Find

UVa 11987 Almost Union-Find(支持删除操作的并查集)

UVA11987Almost Union-Find

UVA11987Almost Union-Find(并查集删除节点)

F - Almost Union-Find (UVA - 11987 )