Kruskal's algorithm is used to find minimum spanning tree in a graph.
It is an edge based greedy algorithm, where we try to find the subset of edges that would give us the minimum spanning tree.
Time complexity - O(ElogE + VlogE)
Space complexity - O(E+V)
Data Structures Used - Pair of(weight, Pair of(a, b)) for each edge a, b of weight w, Union And Find, Priority Queue.
Output - Minimum Spanning Tree with its cost.
#include <iostream> #include <math.h> #include <stdio.h> #include <queue> #include <stack> #include <vector> #include <algorithm> using namespace std; //function to be used in sorting the edges on the basis of their weights. bool compare(const pair<int, pair<int, int> > &p1, const pair<int, pair<int, int> >&p2) { return p2.first > p1.first; } // to retrace back the path from a vertex int parent[10000]; //This function returns the parent of a perticular node. //this is the find function of Union-Find Data structure int findParent(int x){ if(x!= parent[x]) findParent(parent[x]); return parent[x]; } int main() { vector <pair<int , pair<int , int> > > graph, mst; // graph and minimum spanning tree int n,m; // graph with n vertices and m edges cin>>n>>m; for(int i=0;i<m;i++){ int a, b, w; // edge a to b of weight 'w' cin>>a>>b>>w; graph.push_back( pair<int, pair<int, int> >( w, pair <int, int> (a, b))); } //we initially set the parent of each node as the node itself. //this helps us to check for the graph completition. for(int i=0;i<n;i++) parent[i]=i; //sorted according to the weight of the edges sort(graph.begin(), graph.end(), compare); int k=0; int i=0; int totalLength = 0; //we find the n-1 edges that could possibly make the minimum spanning tree while(k != n-1) { int u = graph[i].second.first; int v = graph[i].second.second; int w = graph[i].first; int pu = findParent(u); int pv = findParent(v); //they can not have same parent, in which case, the edge is not included // in the minimum spanning tree. if(pu != pv){ mst.push_back( pair < int , pair <int, int> > (w, pair<int , int> (u, v) )); totalLength += w; k++; //make one's parent equal to the others parent[u]=parent[v]; } i++; } //total length cout<< totalLength<< endl; return 0; }