class DSU {
public:
vector<int> parent;
vector<int> height;
vector<int> size;
DSU(int n){
parent.resize(n,-1);
size.resize(n,1); //stores size of each component. // only use when required otherwise no need
height.resize(n,1);
}
int findRoot(int node){
if(parent[node] == -1){
return node;}
return (parent[node] = findRoot(parent[node]));
}
int Union(int node1 , int node2){
int ra = findRoot(node1);
int rb = findRoot(node2);
if(ra != rb){
if(height[ra] < height[rb]){
parent[ra] = rb;
size[rb] += size[ra]; // only use when required otherwise no need
return size[rb];
}
else if(height[rb] < height[ra]){
parent[rb] = ra;
size[ra] += size[rb]; // only use when required otherwise no need
return size[ra];
}
else{
parent[rb] = ra;
height[ra] ++;
size[ra] += size[rb]; // only use when required otherwise no need
return size[ra];
}
}
return -1;
}
};
Happy Learning – If you require any further information, feel free to contact me.