kyopro-lib

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:x: Maximum bipartite matching
(Mylib/Graph/Matching/bipartite_matching.cpp)

Operations

Requirements

Notes

Problems

References

Verified with

Code

#pragma once
#include <cassert>
#include <utility>
#include <vector>

namespace haar_lib {
  template <typename MaxFlow>
  class bipartite_matching {
    int L_, R_, s_, t_;
    MaxFlow f_;

  public:
    bipartite_matching() {}
    bipartite_matching(int L, int R) : L_(L), R_(R), s_(L + R), t_(s_ + 1), f_(L + R + 2) {
      for (int i = 0; i < L_; ++i) f_.add_edge(s_, i, 1);
      for (int i = 0; i < R_; ++i) f_.add_edge(L_ + i, t_, 1);
    }

    void add_edge(int i, int j) {
      assert(0 <= i and i < L_ and 0 <= j and j < R_);
      f_.add_edge(i, L_ + j, 1);
    }

    int match() {
      return f_.max_flow(s_, t_);
    }

    auto get_matching() {
      const auto g = f_.edges();
      std::vector<std::pair<int, int>> ret;

      for (auto &e : g) {
        if (not e.is_rev and e.cap == 0 and e.from != s_ and e.to != t_) {
          ret.emplace_back(e.from, e.to - L_);
        }
      }

      return ret;
    }
  };
}  // namespace haar_lib
#line 2 "Mylib/Graph/Matching/bipartite_matching.cpp"
#include <cassert>
#include <utility>
#include <vector>

namespace haar_lib {
  template <typename MaxFlow>
  class bipartite_matching {
    int L_, R_, s_, t_;
    MaxFlow f_;

  public:
    bipartite_matching() {}
    bipartite_matching(int L, int R) : L_(L), R_(R), s_(L + R), t_(s_ + 1), f_(L + R + 2) {
      for (int i = 0; i < L_; ++i) f_.add_edge(s_, i, 1);
      for (int i = 0; i < R_; ++i) f_.add_edge(L_ + i, t_, 1);
    }

    void add_edge(int i, int j) {
      assert(0 <= i and i < L_ and 0 <= j and j < R_);
      f_.add_edge(i, L_ + j, 1);
    }

    int match() {
      return f_.max_flow(s_, t_);
    }

    auto get_matching() {
      const auto g = f_.edges();
      std::vector<std::pair<int, int>> ret;

      for (auto &e : g) {
        if (not e.is_rev and e.cap == 0 and e.from != s_ and e.to != t_) {
          ret.emplace_back(e.from, e.to - L_);
        }
      }

      return ret;
    }
  };
}  // namespace haar_lib
Back to top page