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

#include <bits/stdc++.h>

using namespace std;

const int inf = 1 << 25;

struct edge {
  int to, cap, rev, id, isrev;
  edge() {}
  edge(int to, int cap, int rev, int id, int isrev)
      : to(to), cap(cap), rev(rev), id(id), isrev(isrev) {}
};

struct Dinic {
  vector<vector<edge>> G;
  int level[333], iter[333];
  // vector<int> level, iter;
  // Dinic(int V):G(V), level(V), iter(V){};
  Dinic(int V) {
    G.clear();
    G.resize(V);
  }
  void add_edge(int f, int t, int id) {
    G[f].push_back(edge(t, 1, (int)G[t].size(), id, 0));
    G[t].push_back(edge(f, 1, (int)G[f].size() - 1, id, 1));
  }
  void bfs(int s) {
    // fill(level.begin(), level.end(), -1);
    memset(level, -1, sizeof(level));
    queue<int> que;
    level[s] = 0;
    que.push(s);
    while (!que.empty()) {
      int v = que.front();
      que.pop();
      for (int i = 0; i < (int)G[v].size(); i++) {
        edge &e = G[v][i];
        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)G[v].size(); i++) {
      edge &e = G[v][i];
      if (e.cap > 0 && level[v] < level[e.to]) {
        int d = dfs(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          G[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;
      // fill(iter.begin(), iter.end(), 0);
      memset(iter, 0, sizeof(iter));
      int f;
      while ((f = dfs(s, t, inf)) > 0)
        flow += f;
    }
  }
};

int main() {
  int N, M;
  cin >> N >> M;
  Dinic dinic(N);
  for (int i = 0; i < M; i++) {
    int X, Y;
    cin >> X >> Y;
    X--, Y--;
    dinic.add_edge(X, Y, i);
  }
  int S, T;
  cin >> S >> T;
  S--, T--;
  int ans = dinic.max_flow(S, T);
  vector<int> used_rev;
  for (int v = 0; v < (int)dinic.G.size(); v++) {
    for (int i = 0; i < (int)dinic.G[v].size(); i++) {
      edge e = dinic.G[v][i];
      if (e.cap < 1 && e.isrev == 1)
        used_rev.push_back(e.id);
    }
  }
  sort(used_rev.begin(), used_rev.end());
  cout << ans << endl;
  cout << (int)used_rev.size() << endl;
  for (int i = 0; i < (int)used_rev.size(); i++)
    cout << used_rev[i] + 1 << endl;
  return 0;
}

Error: -6
free(): invalid pointer


Fixed submission:

#include <bits/stdc++.h>

using namespace std;

const int inf = 1 << 25;

struct edge {
  int to, cap, rev, id, isrev;
  edge() {}
  edge(int to, int cap, int rev, int id, int isrev)
      : to(to), cap(cap), rev(rev), id(id), isrev(isrev) {}
};

struct Dinic {
  vector<vector<edge>> G;
  int level[333], iter[333];
  // vector<int> level, iter;
  // Dinic(int V):G(V), level(V), iter(V){};
  Dinic(int V) {
    G.clear();
    G.resize(V);
  }
  void add_edge(int f, int t, int id) {
    G[f].emplace_back(t, 1, (int)G[t].size(), id, 0);
    G[t].emplace_back(f, 1, (int)G[f].size() - 1, id, 1);
  }
  void bfs(int s) {
    // fill(level.begin(), level.end(), -1);
    memset(level, -1, sizeof(level));
    queue<int> que;
    level[s] = 0;
    que.push(s);
    while (!que.empty()) {
      int v = que.front();
      que.pop();
      for (int i = 0; i < (int)G[v].size(); i++) {
        edge &e = G[v][i];
        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)G.size(); i++) {
      edge &e = G[v][i];
      if (e.cap > 0 && level[v] < level[e.to]) {
        int d = dfs(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          G[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;
      // fill(iter.begin(), iter.end(), 0);
      memset(iter, 0, sizeof(iter));
      int f;
      while ((f = dfs(s, t, inf)) > 0)
        flow += f;
    }
  }
};

int main() {
  int N, M;
  cin >> N >> M;
  Dinic dinic(N);
  for (int i = 0; i < M; i++) {
    int X, Y;
    cin >> X >> Y;
    X--, Y--;
    dinic.add_edge(X, Y, i);
  }
  int S, T;
  cin >> S >> T;
  S--, T--;
  int ans = dinic.max_flow(S, T);
  vector<int> used_rev;
  for (int v = 0; v < (int)dinic.G.size(); v++) {
    for (int i = 0; i < (int)dinic.G[v].size(); i++) {
      edge e = dinic.G[v][i];
      if (e.cap < 1 && e.isrev == 1)
        used_rev.push_back(e.id);
    }
  }
  sort(used_rev.begin(), used_rev.end());
  cout << ans << endl;
  cout << (int)used_rev.size() << endl;
  for (int i = 0; i < (int)used_rev.size(); i++)
    cout << used_rev[i] + 1 << endl;
  return 0;
}