Steps:
1) Add Edges in Ascending Order by their Weight
2) Do not Create a Cycle. If any edge is Creating a Cycle Skip that Edge
Program:
#include<iostream> using namespace std; class Edge { public: int u,v,w; }; void kruskals() { // steps: 1) take input edges cout<<"\n Enter number of vertices:"; int n; cin>>n; Edge list[n]; cout<<"\n\n Enter Edges:"; int u,v,w,i=0; while(1) { cout<<"\n Enter u,v,w -1 to stop:"; cin>>u>>v>>w; if(u == -1 || v == -1 || w == -1) break; list[i].u = u; list[i].v = v; list[i].w = w; i++; } // 2) sort edges according to weight int edge_count = i; for(i = 0;i< edge_count-1;i++) { for(int j=0;j<edge_count-1-i;j++) { if(list[j].w > list[j+1].w) { Edge temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } cout<<"\n\n Displaying Edge list after sort:"; cout<<"\n U \t V \t W"<<endl; for(i = 0;i<edge_count;i++) { cout<<list[i].u<<"\t"<<list[i].v<<"\t"<<list[i].w<<endl; } // 3) Add edge one by one without creating cycle int component[n]; for(i=0;i<n;i++) component[i] = i; i = 0; int cu,cv; cout<<"\n\n Minimum Cost Spanning Tree:"; int mincost = 0; i = 0; int ne = n-1; while(ne > 0) { u = list[i].u; v = list[i].v; w = list[i].w; cu = component[u]; cv = component[v]; if( cu != cv ) { mincost += w; cout<<"\n Add Edge ("<<u<<","<<v<<")"; for(int j=0;j<n;j++) { if( component[j] == cu ) { component[j] = cv; } } } i++; ne--; } cout<<"\n\n Minimum Cost:"<<mincost; } int main() { freopen("inputGraph.txt","r",stdin); kruskals(); return 0; }
Input File:
6 0 1 1 0 2 4 0 3 3 1 4 4 4 3 6 4 5 1 3 5 5 2 5 2 -1 -1 -1
Output: