并查集模板

代码模板

#include<iostream>

#include<vector>

Using namespace std;

Class UnionFind{

public:

     Vector<int> parent;

     Vector<int> rank;//表示的是集合的深度

UnionFind(int n){

Parent.resize(n);

Rank.resize(n,0);

For(int i = 0;i < n ;i ++){//父母数组初始化为自己的下标,表明一开始每个数组的元素的都是一个集合的根节点

   Parent[i]=i;

}
}

  Int find(int x){

If(parent[x]!=x){//若parent[x]==x 则表明找到一个集合的根节点了

 Parent[x]=find(parent[x]);

}

Return parent[x];
}

Void unionSets(int x,int y){

 Int rootx=find(x);//查找集合元素节点x的根节点

 Int rooty=find(y);//查找集合元素节点y的根节点

If(rootx! =rooty ){//根节点不同表明不是一个集合合并集合

   If( rank[rootx] > rank[rooty]){

      Parent[rooty]=rootx;//一个集合的根节点指向另外一个集合的根节点

}

else{

 Parent[rootx]=rooty;

}

If(rank[rootx]==rank[rooty]){//如果两个集合的深度相同则其中一个深度++;

Rank[rooty]++;

}

}

}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值