Problem p03020 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define fo(i, l, r) for (int i = l; i <= r; i++)
#define of(i, l, r) for (int i = l; i >= r; i--)
#define fe(i, u) for (int i = head[u]; i; i = e[i].next)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
inline void open(const char *s) {
#ifndef ONLINE_JUDGE
  char str[20];
  sprintf(str, "%s.in", s);
  freopen(str, "r", stdin);
  //	sprintf(str,"%s.out",s);
  //	freopen(str,"w",stdout);
#endif
}
inline int rd() {
  static int x, f;
  x = 0;
  f = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-')
      f = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = x * 10 + ch - '0';
  return f > 0 ? x : -x;
}
const int N = 2010;
const int Inf = 1e9;
int n, tot = 1, head[N << 1], vs, vt;
struct edge {
  int v, f, w, next;
} e[N << 3];

inline void add(int u, int v, int f, int w) {
  e[++tot] = edge{v, f, w, head[u]};
  head[u] = tot;
  e[++tot] = edge{u, 0, -w, head[v]};
  head[v] = tot;
}

int cur[N << 1];
ll d[N << 1];
bool inq[N << 1];
inline bool bfs() {
  static queue<int> q;
  while (!q.empty())
    q.pop();
  fo(i, 1, vt) d[i] = -1e16, cur[i] = inq[i] = 0;
  q.push(vs);
  d[vs] = 0;
  cur[vs] = head[vs];
  inq[vs] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inq[u] = 0;
    fe(i, u) {
      int v = e[i].v;
      if (e[i].f && d[v] < d[u] + e[i].w) {
        d[v] = d[u] + e[i].w;
        if (!inq[v]) {
          cur[v] = head[v];
          q.push(v), inq[v] = 1;
        }
      }
    }
  }
  return d[vt] != -1e16;
}
int vis[N], tim = 0;
int dfs(int u, int a) {
  if (u == vt || !a)
    return a;
  int ans = 0;
  vis[u] = tim;
  for (int &i = cur[u]; i; i = e[i].next) {
    int v = e[i].v, f = e[i].f;
    if (f && vis[v] != tim && d[v] == d[u] + e[i].w) {
      f = dfs(v, min(f, a));
      if (!f)
        continue;
      e[i].f -= f;
      e[i ^ 1].f += f;
      ans += f;
      a -= f;
      if (!a)
        break;
    }
  }
  return ans;
}

int main() {
  n = rd();
  vs = n + n + 5;
  vt = vs + 1;
  fo(i, 1, n) {
    int x = rd(), y = rd(), z = rd();
    add(vs, i, z, 0);
    add(i, n + n + 1, Inf, x + y);
    add(i, n + n + 2, Inf, x - y);
    add(i, n + n + 3, Inf, y - x);
    add(i, n + n + 4, Inf, -x - y);
  }
  fo(i, 1, n) {
    int x = rd(), y = rd(), z = rd();
    x = -x;
    y = -y;
    add(i + n, vt, z, 0);
    add(n + n + 1, n + i, Inf, x + y);
    add(n + n + 2, n + i, Inf, x - y);
    add(n + n + 3, n + i, Inf, y - x);
    add(n + n + 4, n + i, Inf, -x - y);
  }
  ll ans = 0;
  while (bfs()) {
    //		while(1){
    ++tim;
    int f = dfs(vs, Inf);
    ans += d[vt] * f;
    //			if(!f)break;
    //		}
  }
  cout << ans;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define fo(i, l, r) for (int i = l; i <= r; i++)
#define of(i, l, r) for (int i = l; i >= r; i--)
#define fe(i, u) for (int i = head[u]; i; i = e[i].next)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
inline void open(const char *s) {
#ifndef ONLINE_JUDGE
  char str[20];
  sprintf(str, "%s.in", s);
  freopen(str, "r", stdin);
  //	sprintf(str,"%s.out",s);
  //	freopen(str,"w",stdout);
#endif
}
inline int rd() {
  static int x, f;
  x = 0;
  f = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-')
      f = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = x * 10 + ch - '0';
  return f > 0 ? x : -x;
}
const int N = 2010;
const int Inf = 1e9;
int n, tot = 1, head[N << 1], vs, vt;
struct edge {
  int v, f, w, next;
} e[N * 20];

inline void add(int u, int v, int f, int w) {
  e[++tot] = edge{v, f, w, head[u]};
  head[u] = tot;
  e[++tot] = edge{u, 0, -w, head[v]};
  head[v] = tot;
}

int cur[N << 1];
ll d[N << 1];
bool inq[N << 1];
inline bool bfs() {
  static queue<int> q;
  while (!q.empty())
    q.pop();
  fo(i, 1, vt) d[i] = -1e16, cur[i] = inq[i] = 0;
  q.push(vs);
  d[vs] = 0;
  cur[vs] = head[vs];
  inq[vs] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inq[u] = 0;
    fe(i, u) {
      int v = e[i].v;
      if (e[i].f && d[v] < d[u] + e[i].w) {
        d[v] = d[u] + e[i].w;
        if (!inq[v]) {
          cur[v] = head[v];
          q.push(v), inq[v] = 1;
        }
      }
    }
  }
  return d[vt] != -1e16;
}
int vis[N], tim = 0;
int dfs(int u, int a) {
  if (u == vt || !a)
    return a;
  int ans = 0;
  vis[u] = tim;
  for (int &i = cur[u]; i; i = e[i].next) {
    int v = e[i].v, f = e[i].f;
    if (f && vis[v] != tim && d[v] == d[u] + e[i].w) {
      f = dfs(v, min(f, a));
      if (!f)
        continue;
      e[i].f -= f;
      e[i ^ 1].f += f;
      ans += f;
      a -= f;
      if (!a)
        break;
    }
  }
  return ans;
}

int main() {
  n = rd();
  vs = n + n + 5;
  vt = vs + 1;
  fo(i, 1, n) {
    int x = rd(), y = rd(), z = rd();
    add(vs, i, z, 0);
    add(i, n + n + 1, Inf, x + y);
    add(i, n + n + 2, Inf, x - y);
    add(i, n + n + 3, Inf, y - x);
    add(i, n + n + 4, Inf, -x - y);
  }
  fo(i, 1, n) {
    int x = rd(), y = rd(), z = rd();
    x = -x;
    y = -y;
    add(i + n, vt, z, 0);
    add(n + n + 1, n + i, Inf, x + y);
    add(n + n + 2, n + i, Inf, x - y);
    add(n + n + 3, n + i, Inf, y - x);
    add(n + n + 4, n + i, Inf, -x - y);
  }
  ll ans = 0;
  while (bfs()) {
    //		while(1){
    ++tim;
    int f = dfs(vs, Inf);
    ans += d[vt] * f;
    //			if(!f)break;
    //		}
  }
  cout << ans;
  return 0;
}