/** * @file * @brief [DSU(Disjoint sets)](https://en.wikipedia.org/wiki/Disjoint-set-data_structure) * @details * dsu : It is a very powerful data structure which keeps track of different * clusters(sets) of elements, these sets are disjoint(doesnot have a common element). * Disjoint sets uses cases : for finding connected components in a graph, * used in Kruskal's algorithm for finding Minimum Spanning tree. * Operations that can be performed: * 1) UnionSet(i,j): add(element i and j to the set) * 2) findSet(i): returns the representative of the set to which i belogngs to. * 3) get_max(i),get_min(i) : returns the maximum and minimum * Below is the class-based approach which uses the heuristic of path compression. * Using path compression in findSet(i),we are able to get to the representative of i * in O(1) time. * @author [AayushVyasKIIT](https://github.com/AayushVyasKIIT) * @see dsu_union_rank.cpp */ #include ///for io #include ///for using vectors using std::cout; using std::endl; using std::vector; /** * @brief Disjoint sets union data structure, class based representation. * @param n number of elements */ class dsu{ private: vector p; /// depth; /// setSize;/// maxElement;/// minElement;/// depth[y]){ std::swap(x,y); } //making the shallower root's parent the deeper root p[x] = y; //if same depth then increase one's depth if(depth[x] == depth[y]){ depth[y]++; } //total size of the resultant set. setSize[y] += setSize[x]; //changing the maximum elements maxElement[y] = std::max(maxElement[x],maxElement[y]); minElement[y] = std::min(minElement[x],minElement[y]); } /** * @brief A utility function which check whether i and j belongs to * same set or not * @param i element of some set * @param j element of some set * @returns `true` if element `i` and `j` ARE in the same set * @returns `false` if element `i` and `j` are NOT in same set */ bool isSame(int i,int j){ if(findSet(i) == findSet(j)){ return true; } return false; } /** * @brief prints the minimum, maximum and size of the set to which i belongs to * @param i element of some set * @returns void */ void get(int i){ cout << "min:" << get_min(i) << " max:" << get_max(i) << " size of set:" <