Kruskal's algorithm is a greedy algorithm in graph theory that finds a minimum spanning tree for a connected weighted graph. It works by growing forest. Kruskal's algorithm finds a safe edge to add to the growing forest by finding an edge with least weight that connects two tree in the forest.
Algorithm
# here + means union of twp sets KRUSKAL(G): A = NULL foreach v in G.V: MAKE-SET(v) foreach (u, v) ordered by weight(u, v), increasing: if FIND-SET(u) != FIND-SET(v): A = A + {(u, v)} UNION(u, v) return A
C Implementation Using Disjoint Set Data Structure
/* Kruskals MST Algorithm Implemented Using Disjoint Set Data Structure (Union & Find)..... * Where Graph Is Represented In Adjacency Matrix Structure "AdjMa"..... * Each Cell Has Two Members weight and visited..... * For Sorting The Edges WRT Its Weight A Edge:Structure Is Considered..... * Where 'u' & 'v' are each end of a vertex with corresponding 'weight'...... */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define TRUE 1 #define FALSE 0 #define N 4 #define INF 9999 typedef struct { int weight; int visited; }AdjMatrix; typedef struct { int weight; int u; int v; }Edge; void takeInput(AdjMatrix graph[][N]) { int i,j; printf("Enter The Matrix:\n"); for(i = 0; i < N; i++) { for (j = 0; j < N; j++) { scanf("%d",&graph[i][j].weight); if(graph[i][j].weight == 0) graph[i][j].weight = INF; graph[i][j].visited = FALSE; } } } void printGraph(AdjMatrix graph[][N]) { int i,j; for(i = 0; i < N; i++) { putchar('['); for (j = 0; j < N; j++) { if(graph[i][j].weight == INF) printf("%3d ",0); else printf("%3d ",graph[i][j].weight); } putchar(']'); putchar('\n'); } } int find(int set[], int i) { if (set[i] == -1) return i; else return find(set, set[i]); } //Function to union two sets... void Union(int set[], int u, int v) { int uset = find(set, u); int vset = find(set, v); set[uset] = vset; } //A comparison function for built-in qsort()... int myComp(const void* a, const void* b) { Edge *a1 = (Edge *)a; Edge *b1 = (Edge *)b; if (a1->weight > b1->weight) return 1; else return -1; } //Function for finding MST using Kruskal's Algorithm.... void kruskalMST(AdjMatrix graph[][N]) { int i, j, k=0, x, y, set[20], cost = 0, e=0; AdjMatrix tree[N][N]; Edge edge[20]; //Picking The Edges... for(i = 0; i < N; i++) { for (j = 0; j < N; j++) { tree[i][j].weight = 0; if(graph[i][j].visited != TRUE) { edge[k].weight = graph[i][j].weight; edge[k].u = i; edge[k++].v = j; graph[j][i].visited = TRUE; } } } //Sorting the edges using quicksort().... qsort(edge, k, sizeof(Edge), myComp); //Setting all elements of parent = -1 //each element of parent is a disjoint set.. memset(set, -1, N * sizeof(set[0])); i = 0; //Loops untill all vertices are considered that is e = #(vertices) - 1 while (e < N - 1) { x = find(set, edge[i].u); y = find(set, edge[i].v); if (x != y) { cost = cost + edge[i].weight; tree[x][y].weight = edge[i].weight; tree[y][x].weight = edge[i].weight; Union(set, x, y); e++; } i++; } puts("\nAdjMatrix For MST:\n"); printGraph(tree); printf("\n\nMST Cost = %d",cost); } int main() { AdjMatrix graph[N][N]; system("cls"); takeInput(graph); printf("\nGiven Graph In AdjMatrix Representation:\n"); printGraph(graph); kruskalMST(graph); return 0; }
Output
Enter The Matrix: 0 7 5 2 7 0 4 3 5 4 0 1 2 3 1 0 Given Graph In AdjMatrix Representation: [ 0 7 5 2 ] [ 7 0 4 3 ] [ 5 4 0 1 ] [ 2 3 1 0 ] AdjMatrix For MST: [ 0 0 0 2 ] [ 0 0 0 3 ] [ 0 0 0 1 ] [ 2 3 1 0 ] MST Cost = 6 -------------------------------- Process exited after 50.48 seconds with return value 0 Press any key to continue . . .
Discussion
- Time Complexity: Time complexity of Kruskals algorithm depends on how we implement each operation like cycle detection and union and sorting etc
- It can be shown to run in O(ElogE) time or equivalently O(ElogV)
- It can be shown to run in O(ElogE) time or equivalently O(ElogV)
- WE can use Union-Find for cycle detection to keep track of which vertices are in which component, Which has at most e iterations. Union Find by rank or path compression take O(log(v)) time.
- Total = O(ElogE + ElogV) = O(Elog E) or O(ElogV)