带权值并查集(转)

Posted msmw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带权值并查集(转)相关的知识,希望对你有一定的参考价值。

[POJ 1988] Cube Stacking
  我们需要新增两种属性cnt[i]cnt[i]与s[i]s[i],分别表示ii之下的块数和ii所在堆的数量。在路径压缩时,cnt[i] += cnt[f[i]] ,另外在连接操作时,需要动态更新cnt[find(u)]和s[find(v)]的信息。

 1 #include <iostream>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define clo std::ios::sync_with_stdio(false)
 5 using namespace std;
 6 const int maxn=1e5+5;
 7 const int N=300004;
 8 int f[N],cnt[N],s[N];
 9 void init()
10     for(int i=1;i<=N;i++)
11         //初始化每个的根都是自己,然后所在堆只有一个 
12         f[i]=i;
13         s[i]=1;
14     
15 
16 
17 int find(int x)
18     int rt;
19     //在路径压缩的时候更新cnt的值,根就是每堆最下面的那个 
20     if(f[x]!=x)
21         int fa=f[x];
22         f[x]=find(f[x]);
23         cnt[x]+=cnt[fa];
24     
25     //都没用路径压缩
26     return f[x]; 
27 
28 int main()
29     std::ios::sync_with_stdio(false);
30     int p;cin>>p;
31     init();
32     while(p--)
33         //cout <<"p=="<<p<<endl;
34         char c;
35         cin>>c;
36         if(c==M)
37         
38             int a,b;cin>>a>>b;
39             int fa=find(a);int fb=find(b);
40             if(fa!=fb)
41                 f[fa]=fb;
42                 cnt[fa]=s[fb];
43                 s[fb]+=s[fa];
44             
45         
46         else
47         
48             int u;
49             cin>>u;
50              find(u);
51             cout <<cnt[u]<<endl;    
52         
53     
54     return 0;
55 

 

以上是关于带权值并查集(转)的主要内容,如果未能解决你的问题,请参考以下文章

总结一下我理解的带权并查集

poj1182 带权并查集

HDU 3038(权值并查集)

HDU-3038How Many Answers Are Wrong权值并查集

#3038:How Many Answers Are Wrong (带权并查集)

#3038:How Many Answers Are Wrong (带权并查集)