Problem p01187 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define reps(i, s, n) for (int i = (int)(s); i < (int)(n); i++)

const int inf = 1e9;

#define MAX_V 3000

struct edge {
  int to, cap, rev;
  edge() {}
  edge(int to, int cap, int rev) : to(to), cap(cap), rev(rev) {}
};
vector<edge> graph[MAX_V];
int level[MAX_V], iter[MAX_V];
void add_edge(int from, int to, int cap) {
  graph[from].emplace_back(to, cap, (int)graph[to].size());
  graph[to].emplace_back(from, 0, (int)graph[from].size() - 1);
}
void bfs(int s) {
  memset(level, -1, sizeof(level));
  level[s] = 0;
  queue<int> que;
  que.push(s);
  while (que.size()) {
    int v = que.front();
    que.pop();
    for (edge &e : graph[v]) {
      if (e.cap > 0 && level[e.to] < 0) {
        level[e.to] = level[v] + 1;
        que.push(e.to);
      }
    }
  }
}
int dfs(int v, int t, int f) {
  if (v == t)
    return f;
  for (int &i = iter[v]; i < (int)graph[v].size(); i++) {
    edge &e = graph[v][i];
    if (e.cap > 0 && level[v] < level[e.to]) {
      int d = dfs(e.to, t, min(e.cap, f));
      if (d > 0) {
        e.cap -= d;
        graph[e.to][e.rev].cap += d;
        return d;
      }
    }
  }
  return 0;
}
int max_flow(int s, int t) {
  int flow = 0;
  while (1) {
    bfs(s);
    if (level[t] < 0)
      return flow;
    memset(iter, 0, sizeof(iter));
    int f;
    while ((f = dfs(s, t, inf)) > 0)
      flow += f;
  }
}

int N, M;
map<int, int> mp;

signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  while (cin >> N, N) {
    int s = 0, t = 1, V = 2;
    rep(i, MAX_V) graph[i].clear();
    mp.clear();
    cin >> M;
    rep(i, M) {
      int d;
      cin >> d;
      mp[d] = V++;
    }
    for (auto p : mp)
      add_edge(s, p.second, 1);
    rep(i, N) {
      cin >> M;
      rep(j, M) {
        int d;
        cin >> d;
        if (mp.count(d))
          add_edge(mp[d], V + i, 1);
      }
      add_edge(V + i, t, 1);
    }
    cout << max_flow(s, t) << endl;
  }

  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define reps(i, s, n) for (int i = (int)(s); i < (int)(n); i++)

const int inf = 1 << 25;

#define MAX_V 3000

struct edge {
  int to, cap, rev;
  edge() {}
  edge(int to, int cap, int rev) : to(to), cap(cap), rev(rev) {}
};
vector<edge> graph[MAX_V];
int level[MAX_V], iter[MAX_V];
void add_edge(int from, int to, int cap) {
  graph[from].emplace_back(to, cap, (int)graph[to].size());
  graph[to].emplace_back(from, 0, (int)graph[to].size() - 1);
}
void bfs(int s) {
  memset(level, -1, sizeof(level));
  level[s] = 0;
  queue<int> que;
  que.push(s);
  while (que.size()) {
    int v = que.front();
    que.pop();
    for (edge &e : graph[v]) {
      if (e.cap > 0 && level[e.to] < 0) {
        level[e.to] = level[v] + 1;
        que.push(e.to);
      }
    }
  }
}
int dfs(int v, int t, int f) {
  if (v == t)
    return f;
  for (int &i = iter[v]; i < (int)graph[v].size(); i++) {
    edge &e = graph[v][i];
    if (e.cap > 0 && level[v] < level[e.to]) {
      int d = dfs(e.to, t, min(e.cap, f));
      if (d > 0) {
        e.cap -= d;
        graph[e.to][e.rev].cap += d;
        return d;
      }
    }
  }
  return 0;
}
int max_flow(int s, int t) {
  int flow = 0;
  while (1) {
    bfs(s);
    if (level[t] < 0)
      return flow;
    memset(iter, 0, sizeof(iter));
    int f;
    while ((f = dfs(s, t, inf)) > 0)
      flow += f;
  }
}

int N, M;
map<int, int> mp;

signed main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  while (cin >> N, N) {
    int s = 0, t = 1, V = 2;
    rep(i, MAX_V) graph[i].clear();
    mp.clear();
    cin >> M;
    rep(i, M) {
      int d;
      cin >> d;
      mp[d] = V++;
    }
    for (auto p : mp)
      add_edge(s, p.second, 1);
    rep(i, N) {
      cin >> M;
      rep(j, M) {
        int d;
        cin >> d;
        if (mp.count(d))
          add_edge(mp[d], V + i, 1);
      }
      add_edge(V + i, t, 1);
    }
    cout << max_flow(s, t) << endl;
  }

  return 0;
}