Header Ads Widget

Kruskal's Algorithm

Kruskal's Algorithm is used to find the minimum spanning tree for a connected weighted graph. The main target of the algorithm is to find the subset of edges by using which, we can traverse every vertex of the graph. Kruskal's algorithm follows greedy approach which finds an optimum solution at every stage instead of focusing on a global optimum.

The Kruskal's algorithm is given as follows.

Algorithm

  • Step 1: Create a forest in such a way that each graph is a separate tree.
  • Step 2: Create a priority queue Q that contains all the edges of the graph.
  • Step 3: Repeat Steps 4 and 5 while Q is NOT EMPTY
  • Step 4: Remove an edge from Q
  • Step 5: IF the edge obtained in Step 4 connects two different trees, then Add it to the forest (for combining two trees into one tree).
    ELSE
    Discard the edge
  • Step 6: END

Time Complexity of the Kruskal Algorithm? - Stack Overflow

Example :

Apply Kruskal's algorithm on the graph given as follows.

MST Graph

Step 1 - Remove all loops and Parallel Edges

Remove all loops and parallel edges from the given graph.

MST Graph with loops

In case of parallel edges, keep the one which has the least cost associated and remove all others.

MST Graph without loops

Step 2 - Arrange all edges in their increasing order of weight

The next step is to create a set of edges and weight, and arrange them in an ascending order of weightage (cost).

MST ascending weightage

Step 3 - Add the edge which has the least weightage

Now we start adding edges to the graph beginning from the one which has the least weight. Throughout, we shall keep checking that the spanning properties remain intact. In case, by adding one edge, the spanning tree property does not hold then we shall consider not to include the edge in the graph.

MST Graph step one

The least cost is 2 and edges involved are B,D and D,T. We add them. Adding them does not violate spanning tree properties, so we continue to our next edge selection.

Next cost is 3, and associated edges are A,C and C,D. We add them again −

MST Graph step two

Next cost in the table is 4, and we observe that adding it will create a circuit in the graph. −

MST Graph step three

We ignore it. In the process we shall ignore/avoid all edges that create a circuit.

MST Graph step four

We observe that edges with cost 5 and 6 also create circuits. We ignore them and move on.

MST Graph step five

Now we are left with only one node to be added. Between the two least cost edges available 7 and 8, we shall add the edge with cost 7.

MST Kruskals Algorithm

By adding edge S,A we have included all the nodes of the graph and we now have minimum cost spanning tree.


Example :
Construct the minimal spanning tree for the graph shown below:

The stages in Kruskal’s algorithm for minimal spanning tree is as follows:

C Program:

#include <iostream>  
#include <vector>  
#include <utility>  
#include <algorithm>  
using namespace std;  
const int MAX = 1e4 + 5;  
int id[MAX], nodes, edges;  
pair <long long, pair<intint> > p[MAX];  
   
void init()  
{  
    for(int i = 0;i < MAX;++i)  
        id[i] = i;  
}  
   
int root(int x)  
{  
    while(id[x] != x)  
    {  
        id[x] = id[id[x]];  
        x = id[x];  
    }  
    return x;  
}  
   
void union1(int x, int y)  
{  
    int p = root(x);  
    int q = root(y);  
    id[p] = id[q];  
}  
   
long long kruskal(pair<long long, pair<intint> > p[])  
{  
    int x, y;  
    long long cost, minimumCost = 0;  
    for(int i = 0;i < edges;++i)  
    {  
        x = p[i].second.first;  
        y = p[i].second.second;  
        cost = p[i].first;  
        if(root(x) != root(y))  
        {  
            minimumCost += cost;  
            union1(x, y);  
        }      
    }  
    return minimumCost;  
}  
   
int main()  
{  
    int x, y;  
    long long weight, cost, minimumCost;  
    init();  
    cout <<"Enter Nodes and edges";  
    cin >> nodes >> edges;  
    for(int i = 0;i < edges;++i)  
    {  
        cout<<"Enter the value of X, Y and edges";  
    cin >> x >> y >> weight;  
        p[i] = make_pair(weight, make_pair(x, y));  
    }  
    sort(p, p + edges);  
    minimumCost = kruskal(p);  
    cout <<"Minimum cost is "<< minimumCost << endl;  
    return 0;  
}  

Output:

Enter Nodes and edges5
5
Enter the value of X, Y and edges5 
4
3
Enter the value of X, Y and edges2
3
1
Enter the value of X, Y and edges1
2
3
Enter the value of X, Y and edges5
4
3
Enter the value of X, Y and edges23
3
4
Minimum cost is 11

Post a Comment

0 Comments