Advertisement
rootUser

Krushkal (OWN)

Jul 9th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.81 KB | None | 0 0
  1. #include<iostream>
  2. #define SIZE 50
  3. using namespace std;
  4.  
  5. int edges;
  6. int startingVertex[SIZE],finishingVertex[SIZE],weight[SIZE],parent[SIZE];
  7.  
  8. void inputGraph();
  9. void doSort(int n);
  10. int findSet(int);
  11. void myUnion(int,int);
  12. int kruskal(int n);
  13.  
  14. int main()
  15. {
  16.     inputGraph();
  17.     doSort(edges);
  18.     int minweight = kruskal(edges);
  19.     cout<<"Minimum weight is : "<<minweight<<endl;
  20.     return 0;
  21. }
  22. void inputGraph()
  23. {
  24.     cout<<"Enter total number of edges : ";
  25.     cin>>edges;
  26.     int i;
  27.     for(i=1;i<=edges;i++)
  28.     {
  29.         cout<<"Edge "<<i<<"'s staring vertex , finishing vertex , weight "<<i<<" : ";
  30.         cin>>startingVertex[i]>>finishingVertex[i]>>weight[i];
  31.     }
  32. }
  33. void doSort(int n)
  34. {
  35.     int i,j;
  36.     for (i=1;i<=n;i++)
  37.     {
  38.         for (j=i+1;j<=n;j++)
  39.         {
  40.             if(weight[i]>weight[j])
  41.             {
  42.                 int temp;
  43.                 //sort weight of edge
  44.                 temp = weight[i];
  45.                 weight[i] = weight[j];
  46.                 weight[j] = temp;
  47.                 //sort startingVertex
  48.                 temp = startingVertex[i];
  49.                 startingVertex[i] = startingVertex[j];
  50.                 startingVertex[j] = temp;
  51.                 //sort finishingVertex
  52.                 temp = finishingVertex[i];
  53.                 finishingVertex[i] = finishingVertex[j];
  54.                 finishingVertex[j] = temp;
  55.             }
  56.         }
  57.     }
  58.     cout<<endl<<"Sorted Elements : "<<endl;
  59.     for (i=1;i<=n ;i++ )
  60.     {
  61.         cout<<"Edge "<<i<<"'s Starting vertex : "<<startingVertex[i]<<" Finishing vertex : "<<finishingVertex[i]<<" Weight : "<<weight[i]<<endl;
  62.     }
  63. }
  64. void myUnion(int childNode,int parentNode)
  65. {
  66.     parent[childNode]=parentNode;
  67. }
  68. int findSet(int i)
  69. {
  70.     while(parent[i]>=0)
  71.     {
  72.         i=parent[i];
  73.     }
  74.     return i;
  75. }
  76. int kruskal(int n)
  77. {
  78.     int i,minweight,temp;
  79.     for (i=1;i<=n;i++)
  80.     {
  81.         parent[i]=-1;
  82.     }
  83.     i=0;
  84.     minweight=0;
  85.     int currentEdge=1;
  86.     int j,k;
  87.     cout<<endl<<"Minimum Spanning tree is : (Vertex-Vertex-weight)"<<endl;
  88.     while(i<=n)//i<n-1 valid
  89.     {
  90.         j=findSet(startingVertex[currentEdge]);
  91.         k=findSet(finishingVertex[currentEdge]);
  92.         if(j!=k)
  93.         {
  94.             i=i+1;
  95.             minweight=minweight+weight[currentEdge];
  96.             cout<<"Edge "<<currentEdge<<"'s Starting vertex : "<<startingVertex[currentEdge]<<" Finishing vertex : "<<finishingVertex[currentEdge]<<" Weight : "<<weight[currentEdge]<<endl;
  97.             myUnion(j,k);
  98.             //temp = i;
  99.         }
  100.         currentEdge++;
  101.         if(currentEdge>=n)
  102.         {
  103.             break;
  104.         }
  105.     }
  106.     return minweight;
  107. }
  108. /*
  109. input:
  110. 6
  111. 1 2 2
  112. 1 3 4
  113. 1 4 3
  114. 2 3 5
  115. 2 4 1
  116. 3 4 10
  117. */
  118. //or
  119. /*
  120. input:
  121. 6
  122. 6
  123. 1 2
  124. 2
  125. 1 4
  126. 3
  127. 2 3
  128. 5
  129. 3 4
  130. 3
  131. 5 3
  132. 5
  133. 5 6
  134. 9
  135. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement