一、等价类的定义
集合S上有关系“~”称为等价关系,如果对于S中的任何元素x,y,z,满足下面三个性质:
(1)x~x 反身性
(2)若x~y,则y~x 对称性
(3)若x~y且y~z,则x~z 传递性
二、并查集的实现:
int make_set(int x){
father[x]=0;
}
int find(int x){
if(father[x]<=0) return x;
return father[x]=find(father[x]);
}
void Union(int x,int y){
int fx=find(x);fy=find(y);
if(fx==fy) return;
if(father[fx]<father[fy]) father[y]=fx;
else{
if(father[fx]==father[fy]) father[fy]--;
father[fx]=fy;
}
}
按秩合并:对于每一个节点,维护一个秩,表示以该节点为根的子树的高度的一个上界。按秩合并策略是让具有较小的秩的根指向具有较大秩的根,最直接的方法就是选择以某结点为跟的子树的高度作为该节点的秩,当然,也可以使用其他量。
路径压缩增加了一次find的操作时间,但可能导致树的高度变小,提高后续操作的效率。