Problem p01421 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int NN = 50 * 50 * 2 + 1;

struct edge {
  int s;
  int t;
  int st;
  int ts;
  int init;
  int nex(int a) { return a == s ? t : s; }
  int res(int a) { return a == s ? st : ts; }
  void use(int a, int v) {
    if (a == s) {
      st -= v;
      ts += v;
    } else {
      st += v;
      ts -= v;
    }
  }
};
typedef vector<edge *>::iterator It;
template <int NN, int MM> struct MaxFlow {
  edge es[MM];
  int esize;
  vector<edge *> edges[NN];
  void add(int a, int b, int v) {
    es[esize].s = a;
    es[esize].t = b;
    es[esize].st = v;
    es[esize].ts = v;
    es[esize].init = v;
    edges[a].push_back(es + esize);
    edges[b].push_back(es + esize);
    esize++;
  }
  edge *pre[NN];
  int done[NN];
  int q[NN];
  int s;
  int t;
  int flow() {
    int ret = 0;
    int f = 0;
    while (1) {
      f++;
      int qs = 0;
      int qe = 1;
      q[0] = s;
      done[s] = f;
      while (qs < qe) {
        int top = q[qs++];
        for (It it = edges[top].begin(); it != edges[top].end(); it++) {
          int nex = (*it)->nex(top);
          if ((*it)->res(top) && done[nex] != f) {
            q[qe++] = nex;
            pre[nex] = *it;
            done[nex] = f;
            if (nex == t) {
              goto OK;
            }
          }
        }
      }
      break;
    OK:
      int p = t;
      int res = INT_MAX;
      while (p != s) {
        int pp = pre[p]->nex(p);
        res = min(res, pre[p]->res(pp));
        p = pp;
      }
      p = t;
      while (p != s) {
        int pp = pre[p]->nex(p);
        pre[p]->use(pp, res);
        p = pp;
      }
      ret += res;
    }
    return ret;
  }
};

MaxFlow<300, 1000> mf;
int main() {
  int N, M;
  cin >> N >> M;
  for (int i = 0; i < M; i++) {
    int X, Y;
    cin >> X >> Y;
    mf.add(X, Y, 1);
  }
  cin >> mf.s >> mf.t;
  cout << mf.flow() << endl;
  int rev = 0;
  for (int i = 0; i < mf.esize; i++) {
    if (mf.es[i].st > mf.es[i].init) {
      rev++;
    }
  }
  cout << rev << endl;
  for (int i = 0; i < mf.esize; i++) {
    if (mf.es[i].st > mf.es[i].init) {
      cout << i + 1 << endl;
    }
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int NN = 50 * 50 * 2 + 1;

struct edge {
  int s;
  int t;
  int st;
  int ts;
  int init;
  int nex(int a) { return a == s ? t : s; }
  int res(int a) { return a == s ? st : ts; }
  void use(int a, int v) {
    if (a == s) {
      st -= v;
      ts += v;
    } else {
      st += v;
      ts -= v;
    }
  }
};
typedef vector<edge *>::iterator It;
template <int NN, int MM> struct MaxFlow {
  edge es[MM];
  int esize;
  vector<edge *> edges[NN];
  void add(int a, int b, int v) {
    es[esize].s = a;
    es[esize].t = b;
    es[esize].st = v;
    es[esize].ts = v;
    es[esize].init = v;
    edges[a].push_back(es + esize);
    edges[b].push_back(es + esize);
    esize++;
  }
  edge *pre[NN];
  int done[NN];
  int q[NN];
  int s;
  int t;
  int flow() {
    int ret = 0;
    int f = 0;
    while (1) {
      f++;
      int qs = 0;
      int qe = 1;
      q[0] = s;
      done[s] = f;
      while (qs < qe) {
        int top = q[qs++];
        for (It it = edges[top].begin(); it != edges[top].end(); it++) {
          int nex = (*it)->nex(top);
          if ((*it)->res(top) && done[nex] != f) {
            q[qe++] = nex;
            pre[nex] = *it;
            done[nex] = f;
            if (nex == t) {
              goto OK;
            }
          }
        }
      }
      break;
    OK:
      int p = t;
      int res = INT_MAX;
      while (p != s) {
        int pp = pre[p]->nex(p);
        res = min(res, pre[p]->res(pp));
        p = pp;
      }
      p = t;
      while (p != s) {
        int pp = pre[p]->nex(p);
        pre[p]->use(pp, res);
        p = pp;
      }
      ret += res;
    }
    return ret;
  }
};

MaxFlow<301, 1000> mf;
int main() {
  int N, M;
  cin >> N >> M;
  for (int i = 0; i < M; i++) {
    int X, Y;
    cin >> X >> Y;
    mf.add(X, Y, 1);
  }
  cin >> mf.s >> mf.t;
  cout << mf.flow() << endl;
  int rev = 0;
  for (int i = 0; i < mf.esize; i++) {
    if (mf.es[i].st > mf.es[i].init) {
      rev++;
    }
  }
  cout << rev << endl;
  for (int i = 0; i < mf.esize; i++) {
    if (mf.es[i].st > mf.es[i].init) {
      cout << i + 1 << endl;
    }
  }
  return 0;
}