Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #define SIZE 50
- using namespace std;
- int edges;
- int startingVertex[SIZE],finishingVertex[SIZE],weight[SIZE],parent[SIZE];
- void inputGraph();
- void doSort(int n);
- int findSet(int);
- void myUnion(int,int);
- int kruskal(int n);
- int main()
- {
- inputGraph();
- doSort(edges);
- int minweight = kruskal(edges);
- cout<<"Minimum weight is : "<<minweight<<endl;
- return 0;
- }
- void inputGraph()
- {
- cout<<"Enter total number of edges : ";
- cin>>edges;
- int i;
- for(i=1;i<=edges;i++)
- {
- cout<<"Edge "<<i<<"'s staring vertex , finishing vertex , weight "<<i<<" : ";
- cin>>startingVertex[i]>>finishingVertex[i]>>weight[i];
- }
- }
- void doSort(int n)
- {
- int i,j;
- for (i=1;i<=n;i++)
- {
- for (j=i+1;j<=n;j++)
- {
- if(weight[i]>weight[j])
- {
- int temp;
- //sort weight of edge
- temp = weight[i];
- weight[i] = weight[j];
- weight[j] = temp;
- //sort startingVertex
- temp = startingVertex[i];
- startingVertex[i] = startingVertex[j];
- startingVertex[j] = temp;
- //sort finishingVertex
- temp = finishingVertex[i];
- finishingVertex[i] = finishingVertex[j];
- finishingVertex[j] = temp;
- }
- }
- }
- cout<<endl<<"Sorted Elements : "<<endl;
- for (i=1;i<=n ;i++ )
- {
- cout<<"Edge "<<i<<"'s Starting vertex : "<<startingVertex[i]<<" Finishing vertex : "<<finishingVertex[i]<<" Weight : "<<weight[i]<<endl;
- }
- }
- void myUnion(int childNode,int parentNode)
- {
- parent[childNode]=parentNode;
- }
- int findSet(int i)
- {
- while(parent[i]>=0)
- {
- i=parent[i];
- }
- return i;
- }
- int kruskal(int n)
- {
- int i,minweight,temp;
- for (i=1;i<=n;i++)
- {
- parent[i]=-1;
- }
- i=0;
- minweight=0;
- int currentEdge=1;
- int j,k;
- cout<<endl<<"Minimum Spanning tree is : (Vertex-Vertex-weight)"<<endl;
- while(i<=n)//i<n-1 valid
- {
- j=findSet(startingVertex[currentEdge]);
- k=findSet(finishingVertex[currentEdge]);
- if(j!=k)
- {
- i=i+1;
- minweight=minweight+weight[currentEdge];
- cout<<"Edge "<<currentEdge<<"'s Starting vertex : "<<startingVertex[currentEdge]<<" Finishing vertex : "<<finishingVertex[currentEdge]<<" Weight : "<<weight[currentEdge]<<endl;
- myUnion(j,k);
- //temp = i;
- }
- currentEdge++;
- if(currentEdge>=n)
- {
- break;
- }
- }
- return minweight;
- }
- /*
- input:
- 6
- 1 2 2
- 1 3 4
- 1 4 3
- 2 3 5
- 2 4 1
- 3 4 10
- */
- //or
- /*
- input:
- 6
- 6
- 1 2
- 2
- 1 4
- 3
- 2 3
- 5
- 3 4
- 3
- 5 3
- 5
- 5 6
- 9
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement