Problem p03020 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#include <vector>
using namespace std;
#define REP(i, x, y) for (ll i = x; i <= y; i++)
#define rep(i, n) REP(i, 1, n)
#define rep0(i, n) REP(i, 0, n - 1)
#define repG(i, x) for (ll i = pos[x]; ~i; i = e[i].next)
#define ll long long
#define db double
const ll N = 3e3 + 7;
const ll INF = 1e15 + 7;
ll pos[N], dis[N], Qu[N * 90], cur[N];
bool vis[N];
struct edge {
  ll v, next, c, f;
} e[N * 2];
ll n, num = 0, S, T, ans = 0;
void add(ll x, ll y, ll c, ll f) {
  e[num] = (edge){y, pos[x], c, f};
  pos[x] = num++;
  e[num] = (edge){x, pos[y], 0, -f};
  pos[y] = num++;
}
bool spfa() {
  ll hd = 0, ti = 1;
  Qu[1] = S;
  rep(i, n + n + 10) {
    dis[i] = INF;
    vis[i] = 1;
    cur[i] = pos[i];
  }
  dis[S] = 0;
  while (hd != ti) {
    ll t = Qu[++hd];
    vis[t] = 1;
    repG(i, t) {
      if (dis[e[i].v] > dis[t] + e[i].f && e[i].c) {
        dis[e[i].v] = dis[t] + e[i].f;
        if (vis[e[i].v]) {
          vis[e[i].v] = 0;
          Qu[++ti] = e[i].v;
        }
      }
    }
  }
  return dis[T] < INF;
}
ll dfs(ll x, ll f) {
  if (x == T) {
    ans += f * dis[T];
    return f;
  }
  vis[x] = 0;
  ll used = 0;
  for (; ~cur[x]; cur[x] = e[cur[x]].next) {
    ll i = cur[x];
    if (e[i].c && dis[e[i].v] == dis[x] + e[i].f && vis[e[i].v]) {
      ll k = dfs(e[i].v, min(e[i].c, f - used));
      used += k;
      e[i].c -= k;
      e[i ^ 1].c += k;
    }
    if (used == f)
      break;
  }
  if (used == f)
    vis[x] = 1;
  return used;
}
int main() {
  memset(pos, -1, sizeof(pos));
  scanf("%lld", &n);
  S = 2 * n + 1;
  T = 2 * n + 2;
  REP(i, 2, 5) add(n + n + 2 * i - 1, n + n + 2 * i, INF, 0);
  rep(i, n) {
    ll c, x, y;
    scanf("%lld%lld%lld", &x, &y, &c);
    add(S, i, c, 0);
    add(i, n + n + 3, c, -x - y);
    add(i, n + n + 5, c, -x + y);
    add(i, n + n + 7, c, x - y);
    add(i, n + n + 9, c, x + y);
  }
  rep(i, n) {
    ll c, x, y;
    scanf("%lld%lld%lld", &x, &y, &c);
    add(i + n, T, c, 0);
    add(n + n + 4, i + n, c, x + y);
    add(n + n + 6, i + n, c, x - y);
    add(n + n + 8, i + n, c, -x + y);
    add(n + n + 10, i + n, c, -x - y);
  }
  while (spfa())
    dfs(S, INF);
  printf("%lld\n", -ans);
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#include <vector>
using namespace std;
#define REP(i, x, y) for (ll i = x; i <= y; i++)
#define rep(i, n) REP(i, 1, n)
#define rep0(i, n) REP(i, 0, n - 1)
#define repG(i, x) for (ll i = pos[x]; ~i; i = e[i].next)
#define ll long long
#define db double
const ll N = 1e4 + 7;
const ll INF = 1e15 + 7;
ll pos[N], dis[N], Qu[N * 90], cur[N];
bool vis[N];
struct edge {
  ll v, next, c, f;
} e[N * 2];
ll n, num = 0, S, T, ans = 0;
void add(ll x, ll y, ll c, ll f) {
  e[num] = (edge){y, pos[x], c, f};
  pos[x] = num++;
  e[num] = (edge){x, pos[y], 0, -f};
  pos[y] = num++;
}
bool spfa() {
  ll hd = 0, ti = 1;
  Qu[1] = S;
  rep(i, n + n + 10) {
    dis[i] = INF;
    vis[i] = 1;
    cur[i] = pos[i];
  }
  dis[S] = 0;
  while (hd != ti) {
    ll t = Qu[++hd];
    vis[t] = 1;
    repG(i, t) {
      if (dis[e[i].v] > dis[t] + e[i].f && e[i].c) {
        dis[e[i].v] = dis[t] + e[i].f;
        if (vis[e[i].v]) {
          vis[e[i].v] = 0;
          Qu[++ti] = e[i].v;
        }
      }
    }
  }
  return dis[T] < INF;
}
ll dfs(ll x, ll f) {
  if (x == T) {
    ans += f * dis[T];
    return f;
  }
  vis[x] = 0;
  ll used = 0;
  for (; ~cur[x]; cur[x] = e[cur[x]].next) {
    ll i = cur[x];
    if (e[i].c && dis[e[i].v] == dis[x] + e[i].f && vis[e[i].v]) {
      ll k = dfs(e[i].v, min(e[i].c, f - used));
      used += k;
      e[i].c -= k;
      e[i ^ 1].c += k;
    }
    if (used == f)
      break;
  }
  if (used == f)
    vis[x] = 1;
  return used;
}
int main() {
  memset(pos, -1, sizeof(pos));
  scanf("%lld", &n);
  S = 2 * n + 1;
  T = 2 * n + 2;
  REP(i, 2, 5) add(n + n + 2 * i - 1, n + n + 2 * i, INF, 0);
  rep(i, n) {
    ll c, x, y;
    scanf("%lld%lld%lld", &x, &y, &c);
    add(S, i, c, 0);
    add(i, n + n + 3, c, -x - y);
    add(i, n + n + 5, c, -x + y);
    add(i, n + n + 7, c, x - y);
    add(i, n + n + 9, c, x + y);
  }
  rep(i, n) {
    ll c, x, y;
    scanf("%lld%lld%lld", &x, &y, &c);
    add(i + n, T, c, 0);
    add(n + n + 4, i + n, c, x + y);
    add(n + n + 6, i + n, c, x - y);
    add(n + n + 8, i + n, c, -x + y);
    add(n + n + 10, i + n, c, -x - y);
  }
  while (spfa())
    dfs(S, INF);
  printf("%lld\n", -ans);
  return 0;
}