带权值并查集(转)

[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 }

猜你喜欢

转载自www.cnblogs.com/Msmw/p/11249955.html
今日推荐