You are on page 1of 1

class Disjointset{

public:
vector<int>parent,rank,size;
Disjointset(int n){
rank.resize(n+1,0);
size.resize(n+1,0);
parent.resize(n+1,0);
for(int i=0;i<=n;i++){
parent[i]=i;
size[i]=1;
}
}
int findparent(int node){
if(node==parent[node]){
return node;
}
return parent[node]=findparent(parent[node]);
}
void UnionByRank(int node1,int node2){
int u=findparent(node1);
int v=findparent(node2);
if(u == v) return;
if(rank[u]<rank[v]){
parent[u]=v;
}
else if(rank[u]>rank[v]){
parent[v]=u;
}
else{
parent[v]=u;
rank[u]++;
}
}
void UnionBySize(int node1,int node2){
int u=findparent(node1);
int v=findparent(node2);
if(u == v) return;
if(size[u]<size[v]){
parent[u]=v;
size[v]+=size[u];
}
else{
parent[v]=u;
size[u]+=size[v];
}
}
};

You might also like