代码模板
#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]++;
}
}
}