带权值并查集(转)
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
以上是关于带权值并查集(转)的主要内容,如果未能解决你的问题,请参考以下文章
HDU-3038How Many Answers Are Wrong权值并查集