CJamie

kruskal

May 12th, 2022
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef pair<int, int> pii;
  5.  
  6. struct Graph
  7. {
  8. int V, E;
  9. vector<pair<int, pii>> edges;
  10. Graph(int V, int E)
  11. {
  12. this->V = V;
  13. this->E = E;
  14. }
  15. void addEdge(int u, int v, int w)
  16. {
  17. edges.push_back({w, {u, v}});
  18. }
  19. int kruskalMST();
  20. };
  21. struct DisjointSets
  22. {
  23. vector<int> parent, rank;
  24. int n;
  25. DisjointSets(int n)
  26. {
  27. this->n = n;
  28. this->parent.resize(n + 1);
  29. this->rank.resize(n + 1, 0);
  30. for (int i = 0; i <= n; i++)
  31. {
  32. this->parent[i] = i;
  33. }
  34. }
  35. int find(int u)
  36. {
  37. if (u != parent[u])
  38. parent[u] = find(parent[u]);
  39. return parent[u];
  40. }
  41. void merge(int x, int y)
  42. {
  43. x = find(x), y = find(y);
  44. if (rank[x] > rank[y])
  45. parent[y] = x;
  46. else
  47. parent[x] = y;
  48.  
  49. if (rank[x] == rank[y])
  50. rank[y]++;
  51. }
  52. };
  53. int Graph::kruskalMST()
  54. {
  55. int totalWeight = 0;
  56. sort(edges.begin(), edges.end());
  57. DisjointSets ds(V);
  58. for (auto edge : edges)
  59. {
  60. int u = edge.second.first;
  61. int v = edge.second.second;
  62.  
  63. int set_u = ds.find(u);
  64. int set_v = ds.find(v);
  65. if (set_u != set_v)
  66. {
  67. cout << u << " - " << v << endl;
  68. totalWeight += edge.first;
  69. ds.merge(set_u, set_v);
  70. }
  71. }
  72.  
  73. return totalWeight;
  74. }
  75. int main()
  76. {
  77. int V = 9, E = 14;
  78. Graph g(V, E);
  79.  
  80. g.addEdge(0, 1, 4);
  81. g.addEdge(0, 7, 8);
  82. g.addEdge(1, 2, 8);
  83. g.addEdge(1, 7, 11);
  84. g.addEdge(2, 3, 7);
  85. g.addEdge(2, 8, 2);
  86. g.addEdge(2, 5, 4);
  87. g.addEdge(3, 4, 9);
  88. g.addEdge(3, 5, 14);
  89. g.addEdge(4, 5, 10);
  90. g.addEdge(5, 6, 2);
  91. g.addEdge(6, 7, 1);
  92. g.addEdge(6, 8, 6);
  93. g.addEdge(7, 8, 7);
  94.  
  95. cout << "Edges of MST are \n";
  96. int mst_wt = g.kruskalMST();
  97.  
  98. cout << "\nWeight of MST is " << mst_wt;
  99.  
  100. return 0;
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment