Advertisement
Purposelessness

Untitled

Apr 18th, 2023
788
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. #include <algorithm>
  2. #include <vector>
  3.  
  4. class Kruskal {
  5.  public:
  6.   struct Edge {
  7.     int x, y;
  8.     int weight;
  9.     bool operator<(const Edge& other) const { return weight < other.weight; }
  10.   };
  11.  
  12.   std::pair<std::vector<Edge>, int> Solve(std::vector<Edge> edges) {
  13.     int cost = 0;
  14.     std::vector<Edge> result;
  15.     parent_.resize(edges.size());
  16.     rank_.resize(edges.size());
  17.     for (int i = 0; i < edges.size(); ++i) {
  18.       MakeSet(i);
  19.     }
  20.     std::sort(edges.begin(), edges.end());
  21.     for (const auto& e : edges) {
  22.       if (FindSet(e.x) != FindSet(e.y)) {
  23.         cost += e.weight;
  24.         result.push_back(e);
  25.         UnionSets(e.x, e.y);
  26.       }
  27.     }
  28.     return {result, cost};
  29.   }
  30.  
  31.   void MakeSet(int v) { parent_[v] = v; }
  32.  
  33.   int FindSet(int v) {
  34.     if (v == parent_[v]) {
  35.       return v;
  36.     }
  37.     return parent_[v] = FindSet(parent_[v]);
  38.   }
  39.  
  40.   void UnionSets(int a, int b) {
  41.     a = FindSet(a);
  42.     b = FindSet(b);
  43.     if (a != b) {
  44.       if (rank_[a] < rank_[b]) {
  45.         std::swap(a, b);
  46.       }
  47.       parent_[b] = a;
  48.       if (rank_[a] == rank_[b]) {
  49.         ++rank_[a];
  50.       }
  51.     }
  52.   }
  53.  
  54.  private:
  55.   std::vector<int> parent_;
  56.   std::vector<int> rank_;
  57. };
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement