diff --git a/data_structures/dsu_path_compresssion.cpp b/data_structures/dsu_path_compresssion.cpp new file mode 100644 index 000000000..ad8bc231c --- /dev/null +++ b/data_structures/dsu_path_compresssion.cpp @@ -0,0 +1,124 @@ +#include +#include + +using namespace std; + +//Disjoint set union +class DSU{ + private: + // p: keeps track of parent of i + // depth: tracks the depth of i + // setSize: size of each chunk(set) + // maxElement : max of each set, using maxElement[representative] + // minElement : min of each set, using minElement[representative] + vector p,depth,setSize,maxElement,minElement; + public: + // parameter : int n -> maximum number of items + DSU(int n){ + p.assign(n,0); + //initially all of them are their own parents. + for(int i=0;i root(representative) + return (p[i] = findSet(p[i])); + } + //union of 2 sets + void UnionSet(int i,int j){ + //check if both belongs to same set or not + if(isSame(i,j)){ + return; + } + + //we find the representative of the i and j + int x = findSet(i); + int y = findSet(j); + + //always keeping the min as x + //shallow tree + if(depth[x]>depth[y]){ + 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] = max(maxElement[x],maxElement[y]); + minElement[y] = min(minElement[x],minElement[y]); + } + //checks if both belongs to same set + bool isSame(int i,int j){ + if(findSet(i) == findSet(j)){ + return true; + } + return false; + } + //returns min max size of i's set + void get(int i){ + cout << "min:" << get_min(i) << " max:" << get_max(i) << " size of set:" < +#include + + +using namespace std; + +class DSU{ + private: + // p: keeps track of parent of i + // depth: tracks the depth of i + // setSize: size of each chunk(set) + vector p,depth,setSize; + public: + //parameter : int n -> maximum number of items + DSU(int n){ + p.assign(n,0); + //initially all of them their own parents + depth.assign(n,0); + setSize.assign(n,0); + for(int i=0;i p[i] + while(i!=p[i]){ + i = p[i]; + } + return i; + } + //union of 2 sets + void unionSet(int i,int j){ + //check if both belongs to same set or not + if(isSame(i,j)){ + return; + } + //we find representative of the i and j + int x = findSet(i); + int y = findSet(j); + + //always keeping the min as x + //in order to create a shallow tree + if(depth[x]>depth[y]){ + swap(x,y); + } + //making the shallower tree' root parent of 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]; + } + // checks if both belongs to same set + bool isSame(int i,int j){ + if(findSet(i) == findSet(j)){ + return true; + } + return false; + } + void getParents(int i){ + while(p[i]!=i){ + cout << i << " ->"; + i = p[i]; + } + cout << p[i] << endl; + } + +}; + +int main(){ + int n; + n = 10; + //n: number of items + DSU d(n+1); + d.unionSet(2,1); //performs union operation on 1 and 2 + d.unionSet(1,4); + d.unionSet(8,1); + + d.unionSet(3,5); + d.unionSet(5,6); + d.unionSet(5,7); + + d.unionSet(9,10); + d.unionSet(2,10); + + //keeping track of the changes using parent pointers + d.getParents(7); + d.getParents(2); + + +} \ No newline at end of file