Problem p03020 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
const LL MAX = 1e17;
const LL N = 1100;
struct qq {
  LL x, y, z, z1, last;
} e[N * 10];
LL num, last[N];
void init(LL x, LL y, LL z, LL z1) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].z = z;
  e[num].z1 = z1;
  e[num].last = last[x];
  last[x] = num;
  swap(x, y);
  z = 0;
  z1 = -z1;
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].z = z;
  e[num].z1 = z1;
  e[num].last = last[x];
  last[x] = num;
}
LL from[N];
LL f[N];
bool in[N];
LL st, ed;
bool SPFA() {
  for (LL u = 1; u <= ed; u++)
    from[u] = -1, f[u] = -MAX, in[u] = false;
  queue<int> q;
  q.push(st);
  f[st] = 0;
  in[st] = true;
  while (!q.empty()) {
    LL x = q.front();
    q.pop();
    for (LL u = last[x]; u != -1; u = e[u].last) {
      LL y = e[u].y;
      if (e[u].z > 0 && f[y] < f[x] + e[u].z1) {
        f[y] = f[x] + e[u].z1;
        from[y] = u;
        if (in[y] == false) {
          in[y] = true;
          q.push(y);
        }
      }
    }
    in[x] = false;
  }
  return from[ed] != -1;
}
LL ans = 0;
void lalal() {
  // printf("YES!\n");
  LL x = from[ed], t = MAX;
  while (x != -1) {
    t = min(t, e[x].z);
    x = from[e[x].x];
  }
  x = from[ed];
  while (x != -1) {
    ans = ans + t * e[x].z1;
    e[x].z -= t;
    e[x ^ 1].z += t;
    x = from[e[x].x];
  }
  return;
}
int main() {
  num = 1;
  memset(last, -1, sizeof(last));
  LL n;
  scanf("%lld", &n);
  st = 2 * n + 10 + 1;
  ed = st + 1;
  LL cnt = 0;
  for (LL u = 1; u <= n; u++) {
    LL x, y, c;
    scanf("%lld%lld%lld", &x, &y, &c);
    init(st, u, c, 0);
    init(u, 2 * n + 1, MAX, x + y);
    init(u, 2 * n + 2, MAX, x - y);
    init(u, 2 * n + 3, MAX, -x + y);
    init(u, 2 * n + 4, MAX, -x - y);
  }
  for (LL u = 1; u <= n; u++) {
    LL x, y, c;
    scanf("%lld%lld%lld", &x, &y, &c);
    init(u + n, ed, c, 0);
    init(2 * n + 1 + 4, u + n, MAX, x + y);
    init(2 * n + 2 + 4, u + n, MAX, x - y);
    init(2 * n + 3 + 4, u + n, MAX, -x + y);
    init(2 * n + 4 + 4, u + n, MAX, -x - y);
  }
  init(2 * n + 1, 2 * n + 4 + 4, MAX, 0);
  init(2 * n + 2, 2 * n + 3 + 4, MAX, 0);
  init(2 * n + 3, 2 * n + 2 + 4, MAX, 0);
  init(2 * n + 4, 2 * n + 1 + 4, MAX, 0);
  while (SPFA())
    lalal();
  printf("%lld\n", ans);
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
const LL MAX = 1e17;
const LL N = 2100;
struct qq {
  LL x, y, z, z1, last;
} e[N * 10];
LL num, last[N];
void init(LL x, LL y, LL z, LL z1) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].z = z;
  e[num].z1 = z1;
  e[num].last = last[x];
  last[x] = num;
  swap(x, y);
  z = 0;
  z1 = -z1;
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].z = z;
  e[num].z1 = z1;
  e[num].last = last[x];
  last[x] = num;
}
LL from[N];
LL f[N];
bool in[N];
LL st, ed;
bool SPFA() {
  for (LL u = 1; u <= ed; u++)
    from[u] = -1, f[u] = -MAX, in[u] = false;
  queue<int> q;
  q.push(st);
  f[st] = 0;
  in[st] = true;
  while (!q.empty()) {
    LL x = q.front();
    q.pop();
    for (LL u = last[x]; u != -1; u = e[u].last) {
      LL y = e[u].y;
      if (e[u].z > 0 && f[y] < f[x] + e[u].z1) {
        f[y] = f[x] + e[u].z1;
        from[y] = u;
        if (in[y] == false) {
          in[y] = true;
          q.push(y);
        }
      }
    }
    in[x] = false;
  }
  return from[ed] != -1;
}
LL ans = 0;
void lalal() {
  // printf("YES!\n");
  LL x = from[ed], t = MAX;
  while (x != -1) {
    t = min(t, e[x].z);
    x = from[e[x].x];
  }
  x = from[ed];
  while (x != -1) {
    ans = ans + t * e[x].z1;
    e[x].z -= t;
    e[x ^ 1].z += t;
    x = from[e[x].x];
  }
  return;
}
int main() {
  num = 1;
  memset(last, -1, sizeof(last));
  LL n;
  scanf("%lld", &n);
  st = 2 * n + 10 + 1;
  ed = st + 1;
  LL cnt = 0;
  for (LL u = 1; u <= n; u++) {
    LL x, y, c;
    scanf("%lld%lld%lld", &x, &y, &c);
    init(st, u, c, 0);
    init(u, 2 * n + 1, MAX, x + y);
    init(u, 2 * n + 2, MAX, x - y);
    init(u, 2 * n + 3, MAX, -x + y);
    init(u, 2 * n + 4, MAX, -x - y);
  }
  for (LL u = 1; u <= n; u++) {
    LL x, y, c;
    scanf("%lld%lld%lld", &x, &y, &c);
    init(u + n, ed, c, 0);
    init(2 * n + 1 + 4, u + n, MAX, x + y);
    init(2 * n + 2 + 4, u + n, MAX, x - y);
    init(2 * n + 3 + 4, u + n, MAX, -x + y);
    init(2 * n + 4 + 4, u + n, MAX, -x - y);
  }
  init(2 * n + 1, 2 * n + 4 + 4, MAX, 0);
  init(2 * n + 2, 2 * n + 3 + 4, MAX, 0);
  init(2 * n + 3, 2 * n + 2 + 4, MAX, 0);
  init(2 * n + 4, 2 * n + 1 + 4, MAX, 0);
  while (SPFA())
    lalal();
  printf("%lld\n", ans);
  return 0;
}