并查集
功能:1.快速合并集合 2.快速查找两个元素是否在同一个集合内 (时间复杂度均为 l o g ( n ) log(n) log(n))
int par[N],cnt[N]; //储存节点N的父节点 特别规定根节点的父节点是其本身
void init(){ //初始化:令每个节点的父节点为其自身 即初始时每个节点自成一个集合
for(int i=1;i<=N;i++){
par[i]=i;
cnt[i]=1;
}
return ;
}
void unit(int x,int y){
par[find(x)]=find(y);
return ;
}
void find(int x){ //查找x节点的祖宗节点(祖宗节点是集合的特征)
while(x!=par[x]) par[x]=find(par[x]);//外加路径压缩 优化再次查找时的时间成本
return ;
}
int check(int x,int y){//快速查找两个元素是否在同一集合内
if(find(x)==find(y)) return 1;//若x与y的祖宗节点相同 代表x与y同属一个集合
else return 0;
}