并查集模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集模板相关的知识,希望对你有一定的参考价值。
并查集是一种用来管理元素分组情况的数据结构、
并查集的复杂度:并查集加入两个优化(路径压缩和高度的合并)以后效率很高,对n个元素的并查集进行一次操作的复杂度是O(a(n)).在这里,a(n)是阿克曼(Ackermann)函数的反函数,这比O(log(n))还快,不过这是“均摊复杂度”,也就是说不是每一次操作都满足这个复杂度,而是多次操作以后平均每一次的操作的复杂度是O(a(n))
1 int par[MAX_N]; //父亲 2 int rank[MAX_N]; //树的高度 3 4 //初始化n个元素 5 void init(int n) 6 { 7 for(int i=0;i<=n;++i){ 8 par[i]=i; 9 rank[i]=0; 10 } 11 } 12 //查询树的根非递归实现 13 int find(int x) 14 { 15 while(par[x]!=x) 16 x=par[x]; 17 return x; 18 } 19 //合并x和y所属集合 20 void unite(int x,int y) 21 { 22 int fx=find(x); 23 int fy=find(y); 24 if(fx==fy) return; 25 if(rank[fx]>rank[fy]) 26 par[fx]=fy; 27 else{ 28 par[fy]=fx; 29 if(rank[fx]==rank[fy]) 30 rank[x]++; 31 } 32 } 33 //关于路径压缩 34 int find2(int x) 35 { 36 int fx=find(x); 37 int t; 38 while(x!=fx){ 39 t=par[x]; 40 par[x]=fx; 41 x=t; 42 } 43 return fx; 44 }
以上是关于并查集模板的主要内容,如果未能解决你的问题,请参考以下文章
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代