diff --git a/Data Structures/UnionFind/C/DSU.c b/Data Structures/UnionFind/C/DSU.c new file mode 100644 index 00000000..5cf744d7 --- /dev/null +++ b/Data Structures/UnionFind/C/DSU.c @@ -0,0 +1,73 @@ +#include +#include +using namespace::std; + + +int *array; // array representing the parents +int *rank; // array representing the ranks + +int get_parent(int index) +{ + int parent; + // TODO + if(array[index]==index) return index; + else + { + parent = get_parent(array[index]); + if(array[index]!=parent) + { + rank[array[index]]-=1+rank[index]; + } + array[index]=parent; + } + return parent; +} + +void make_DSU(int n) +{ + array = (int*)malloc(n*sizeof(int)); + rank = (int*)malloc(n*sizeof(int)); + for(int i=0;i get_parent(j) || (get_parent(i)==get_parent(j) && i>j) ) + { + array[get_parent(j)] = get_parent(i); + rank[get_parent(i)]+=1+rank[get_parent(j)]; + } + else + { + array[get_parent(i)] = get_parent(j); + rank[get_parent(j)]+=1+rank[get_parent(i)]; + } + } + return; +} + + +int main() // driver to test +{ + make_DSU(5); + cout<