Cod sursa(job #2430706)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 15 iunie 2019 22:30:11
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 10000;

class BipartiteMatcher {
  public:
    vector<vector<int> >G;
    vector<int>L, R;

  private:
    vector<int>vis;

    bool pairUp(int node) {
      if (vis[node])
        return false;
      vis[node] = true;
      for (auto it:G[node])
        if (L[it] == 0) {
          R[node] = it;
          L[it] = node;
          return true;
        }
      for (auto it:G[node])
        if (pairUp(L[it])) {
          R[node] = it;
          L[it] = node;
          return true;
        }
      return false;
    }

  public:
    BipartiteMatcher(int n, int m) {
      G.resize(n + 1);
      L.resize(m + 1); R.resize(n + 1);
      vis.resize(n + 1);
    }

    void addEdge(int u, int v) {
      G[u].push_back(v);
    }

    int maxMatch() {
      bool ok;
      int ans = 0;
      do {
        ok = false;
        fill(vis.begin(), vis.end(), 0);
        for (int i = 1; i <= (int)R.size(); ++i)
          if (R[i] == 0 && pairUp(i))
            ok = 1, ans++;
      } while (ok);
      return ans;
    }

    void resetMatch() {
      fill(L.begin(), L.end(), 0);
      fill(R.begin(), R.end(), 0);
      fill(vis.begin(), vis.end(), 0);
    }

    void reset() {
      resetMatch();
      fill(G.begin(), G.end(), vector<int>());
    }

    void printMatch() {
      printf("%d\n", maxMatch());
      for (int i = 1; i < (int)R.size(); ++i)
        if (R[i])
          printf("%d %d\n", i, R[i]);
    }
};
int main() {
  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);

  int n, m, e;

  scanf("%d%d%d", &n, &m, &e);
  BipartiteMatcher M(n, m);
  for (int i = 1; i <= e; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    M.addEdge(u, v);
  }

  M.printMatch();

  return 0;
}