Problem p02378 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a) begin((a)), end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)

#define FF first
#define SS second

#define DUMP(x) cout << #x << ":" << (x) << endl
template <class S, class T> istream &operator>>(istream &is, pair<S, T> &p) {
  return is >> p.FF >> p.SS;
}
template <class T> istream &operator>>(istream &is, vector<T> &xs) {
  for (auto &x : xs)
    is >> x;
  return is;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &p) {
  return os << p.FF << " " << p.SS;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &xs) {
  for (unsigned int i = 0; i < xs.size(); ++i)
    os << (i ? " " : "") << xs[i];
  return os;
}
template <class T> void maxi(T &x, T y) {
  if (x < y)
    x = y;
}
template <class T> void mini(T &x, T y) {
  if (x > y)
    x = y;
}

const double EPS = 1e-10;
const double PI = acos(-1.0);
const LL MOD = 1e9 + 7;

int bipartite_matching(VVI &G, VI &matchU, VI &matchV) {
  int N = G.size();
  fill(ALL(matchU), -1);
  fill(ALL(matchV), -1);
  vector<int> level(N);
  vector<bool> finished(N);

  int total = 0;
  for (bool up = true; up;) {
    up = false;

    // bfs
    fill(ALL(level), -1);
    queue<int> Q;
    REP(i, N) {
      if (matchU[i] == -1) {
        level[i] = 0;
        Q.push(i);
      }
    }
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      for (auto to : G[u]) {
        if (matchV[to] != -1) {
          level[matchV[to]] = level[u] + 1;
          Q.push(matchV[to]);
        }
      }
    }

    // dfs
    fill(ALL(finished), false);
    function<bool(int)> dfs = [&](int u) {
      finished[u] = true;
      for (auto to : G[u]) {
        int bk = matchV[to];
        if (bk == -1 ||
            (!finished[bk] && level[bk] == level[u] + 1 && dfs(bk))) {
          matchU[u] = to;
          matchV[to] = u;
          return true;
        }
      }
      return false;
    };

    REP(i, N) {
      if (matchU[i] == -1 && dfs(i)) {
        up = true;
        ++total;
      }
    }
  }
  return total;
}

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  int X, Y, E;
  cin >> X >> Y >> E;
  VVI G(X);
  REP(i, E) {
    int x, y;
    cin >> x >> y;
    G[x].PB(y);
  }
  VI mu(X), mv(Y);
  cout << bipartite_matching(G, mu, mv) << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a) begin((a)), end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)

#define FF first
#define SS second

#define DUMP(x) cout << #x << ":" << (x) << endl
template <class S, class T> istream &operator>>(istream &is, pair<S, T> &p) {
  return is >> p.FF >> p.SS;
}
template <class T> istream &operator>>(istream &is, vector<T> &xs) {
  for (auto &x : xs)
    is >> x;
  return is;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &p) {
  return os << p.FF << " " << p.SS;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &xs) {
  for (unsigned int i = 0; i < xs.size(); ++i)
    os << (i ? " " : "") << xs[i];
  return os;
}
template <class T> void maxi(T &x, T y) {
  if (x < y)
    x = y;
}
template <class T> void mini(T &x, T y) {
  if (x > y)
    x = y;
}

const double EPS = 1e-10;
const double PI = acos(-1.0);
const LL MOD = 1e9 + 7;

int bipartite_matching(VVI &G, VI &matchU, VI &matchV) {
  int N = G.size();
  fill(ALL(matchU), -1);
  fill(ALL(matchV), -1);
  vector<int> level(N);
  vector<bool> finished(N);

  int total = 0;
  for (bool up = true; up;) {
    up = false;

    // bfs
    fill(ALL(level), -1);
    queue<int> Q;
    REP(i, N) {
      if (matchU[i] == -1) {
        level[i] = 0;
        Q.push(i);
      }
    }
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      for (auto to : G[u]) {
        if (matchV[to] != -1 && level[matchV[to]] == -1) {
          level[matchV[to]] = level[u] + 1;
          Q.push(matchV[to]);
        }
      }
    }

    // dfs
    fill(ALL(finished), false);
    function<bool(int)> dfs = [&](int u) {
      finished[u] = true;
      for (auto to : G[u]) {
        int bk = matchV[to];
        if (bk == -1 ||
            (!finished[bk] && level[bk] == level[u] + 1 && dfs(bk))) {
          matchU[u] = to;
          matchV[to] = u;
          return true;
        }
      }
      return false;
    };

    REP(i, N) {
      if (matchU[i] == -1 && dfs(i)) {
        up = true;
        ++total;
      }
    }
  }
  return total;
}

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  int X, Y, E;
  cin >> X >> Y >> E;
  VVI G(X);
  REP(i, E) {
    int x, y;
    cin >> x >> y;
    G[x].PB(y);
  }
  VI mu(X), mv(Y);
  cout << bipartite_matching(G, mu, mv) << endl;

  return 0;
}