Disjoint Set Union🚩🚩🚩

PHOTO EMBED

Tue Feb 01 2022 13:37:16 GMT+0000 (Coordinated Universal Time)

Saved by @vaibhav_55

/*This is the program to  ilustrate the Disjoint set union(DSU) concept 
	Applications:-
    	1)cycle detection in graph
        2)no of connected components with their size
        3)MST->kruskal's Algorithm
        4)to find which element belongs to which set
*/

//globel declearation of parent and size array
int size[100001];
int parent[100001];

//this function is call at the very beginning in the main funciton
void assignParents()
{
    for (int i = 0; i <= 100001; i++)
    {
        parent[i] = i;
        size[i] = 1;
    }
}

//--->Function to find super parent of a node<---

/*
 -->without any optimization<--

// int find_super_parent(int a)
// {
//     if (parent[a] == a)
//     {
//         return a;
//     }
//     else
//     {
//         return find_super_parent(parent[a]);
//     }
// }
*/

//-->with path optimization<--
int find_super_parent(int a)
{
    if (parent[a] == a)
    {
        return a;
    }
    else
    {
        int super_parent = find_super_parent(parent[a]);
        parent[a] = super_parent;

        return super_parent;
    }
}
/*
ll super_parent(ll n)
{
    if (parent[n] == n)
        return n;
    else
        return super_parent(parent[n]);
}

void make_union(ll a, ll b)
{

    ll p_a = super_parent(a);
    ll p_b = super_parent(b);

    if (p_a == p_b)
        cout << a << " and " << b << " already belongs to same set.\n";
    else
    {
        if (size[p_a] < size[p_b])
        {
            parent[p_a] = p_b;
            size[p_b] += size[p_a];
        }
        else
        {
            parent[p_b] = p_a;
            size[p_a] += size[p_b];
        }
    }
*/


/*---------------------------------------------------------------------------*/

//--->Function to make union of two elements/sets<---
//-->without any optimization
// void make_union(int a, int b)
// {
//     int pa = find_super_parent(a);
//     int pb = find_super_parent(b);

//     if (pa != pb)
//     {
//         cout << a << " " << b << endl;
//         parent[pa] = pb;
//         cout << "The set consisting entered elements has been merged" << endl;
//     }
//     else
//     {
//         cout << "Entered elements already belongs to same set" << endl;
//     }
// }

//-->with size optimization
void make_union(int a, int b)
{
    int pa = find_super_parent(a);
    int pb = find_super_parent(b);

    if (pa == pb)
    {
        cout << "Entered elements already belongs to same set" << endl;
    }

    else
    {
        if (size[pa] < size[pb])
        {
            parent[pa] = pb;
            size[pb] += size[pa];
        }
        else
        {
            parent[pb] = pa;
            size[pa] += size[pb];
        }
    }
}
content_copyCOPY