码迷,mamicode.com
首页 > 其他好文 > 详细

UVA11987 【Almost Union-Find】

时间:2018-11-08 19:13:34      阅读:110      评论:0      收藏:0      [点我收藏+]

标签: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 }

 

UVA11987 【Almost Union-Find】

标签:can   ==   \n   printf   div   std   lib   oid   合并   

原文地址:https://www.cnblogs.com/zytwan/p/9931173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!