并查集模板
并查集是若干个不想交的集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如求无向图的连通分量个数等。
并查集的精髓就是它的三种操作:初始化、查找、合并
int father[MAX];//father[x]表示x的父节点 int rank[MAX];//rank[x]表示x的秩 void Make_set(int x) { father[x]=x; rank[x]=0; } int find(int x)//查找元素所在的父节点,回溯时压缩路径 { if(x!=father[x]) father[x]=find(father[x]); return father[x]; } void Uion(int x,int y)//按秩合并x,y所在的集合 { x=find(x); y=find(y); if(x==y) return ; if(rank[x]>rank[y]) father[y]=x; else if(rank[x]<rank[y]) father[x]=y; else { rank[x]++; father[y]=x; } }
注意:代码中路径压缩时秩是不需要变化的,秩只是表示节点高度的一个上界。当然rank在不同题目中,有不同的作用,例如计数。
如果秩进行计数时,路径压缩也是不需要变化。因为所属集合的根节点的秩在合并时已经更新,其他子节点的秩不用到也无需变化。