Problem p03020 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int read() {
  int x = 0;
  bool f = 0;
  char c = getchar();
  while (c < '0' || c > '9')
    f |= c == '-', c = getchar();
  while (c >= '0' && c <= '9')
    x = x * 10 + (c ^ 48), c = getchar();
  return f ? -x : x;
}

#define MAXN 2010
#define MAXM 10000
#define INF 1ll << 60
#define LL long long
struct Edge {
  LL w, c;
  int v, Next;
} E[MAXM + 5];
int Adj[MAXN + 5], ecnt;
void AddEdge(int u, int v, LL Cap, LL Cost) {
  E[ecnt].v = v, E[ecnt].w = Cap, E[ecnt].c = Cost, E[ecnt].Next = Adj[u],
  Adj[u] = ecnt++;
  E[ecnt].v = u, E[ecnt].w = 0, E[ecnt].c = -Cost, E[ecnt].Next = Adj[v],
  Adj[v] = ecnt++;
}

int pre[MAXN + 5];
LL Dist[MAXN + 5];
bool vis[MAXN + 5];
int cnt[MAXN + 5];
bool SPFA(int S, int T, int N, LL &Flow, LL &Cost) {
  for (int i = 0; i <= N; i++)
    Dist[i] = INF, pre[i] = -1, vis[i] = 0, cnt[i] = 0;
  queue<int> Q;
  Q.push(S);
  Dist[S] = 0, vis[S] = 1;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    vis[u] = 0;
    for (int i = Adj[u]; i != -1; i = E[i].Next) {
      int v = E[i].v, c = E[i].c;
      if (E[i].w && Dist[v] > Dist[u] + c) {
        Dist[v] = Dist[u] + c;
        pre[v] = i;
        if (!vis[v]) {
          ++cnt[v];
          vis[v] = 1, Q.push(v);
        }
      }
    }
  }
  if (Dist[T] == INF)
    return 0;
  LL Min = INF;
  for (int i = pre[T]; i != -1; i = pre[E[i ^ 1].v])
    Min = min(Min, (LL)E[i].w);
  for (int i = pre[T]; i != -1; i = pre[E[i ^ 1].v])
    E[i].w -= Min, E[i ^ 1].w += Min, Cost += Min * E[i].c;
  Flow += Min;
  return 1;
}
pair<LL, LL> Dinic(int S, int T, int N) {
  LL Flow = 0, Cost = 0;
  while (1)
    if (!SPFA(S, T, N, Flow, Cost))
      break;
  return make_pair(Flow, Cost);
}

#undef MAXN
#undef MAXM

#define MAXM 1000
int N, M, K;
int A[MAXM + 5];

int main() {
  N = read();
  ecnt = 0;
  memset(Adj, -1, sizeof Adj);
  for (int i = 1; i <= N; i++) {
    int x = read(), y = read(), c = read();
    AddEdge(1, i + 1, c, 0);
    AddEdge(i + 1, N + 2, INF, x + y);
    AddEdge(i + 1, N + 3, INF, -x + y);
    AddEdge(i + 1, N + 4, INF, x - y);
    AddEdge(i + 1, N + 5, INF, -x - y);
  }
  for (int i = 1; i <= N; i++) {
    int x = read(), y = read(), c = read();
    AddEdge(i + 5 + N, 2 * N + 6, c, 0);
    AddEdge(N + 2, i + 5 + N, INF, -x - y);
    AddEdge(N + 3, i + 5 + N, INF, x - y);
    AddEdge(N + 4, i + 5 + N, INF, -x + y);
    AddEdge(N + 5, i + 5 + N, INF, x + y);
  }
  printf("%lld", -Dinic(1, 2 * N + 6, 2 * N + 6).second);
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int read() {
  int x = 0;
  bool f = 0;
  char c = getchar();
  while (c < '0' || c > '9')
    f |= c == '-', c = getchar();
  while (c >= '0' && c <= '9')
    x = x * 10 + (c ^ 48), c = getchar();
  return f ? -x : x;
}

#define MAXN 2010
#define MAXM 50000
#define INF 1ll << 60
#define LL long long
struct Edge {
  LL w, c;
  int v, Next;
} E[MAXM + 5];
int Adj[MAXN + 5], ecnt;
void AddEdge(int u, int v, LL Cap, LL Cost) {
  E[ecnt].v = v, E[ecnt].w = Cap, E[ecnt].c = Cost, E[ecnt].Next = Adj[u],
  Adj[u] = ecnt++;
  E[ecnt].v = u, E[ecnt].w = 0, E[ecnt].c = -Cost, E[ecnt].Next = Adj[v],
  Adj[v] = ecnt++;
}

int pre[MAXN + 5];
LL Dist[MAXN + 5];
bool vis[MAXN + 5];
int cnt[MAXN + 5];
bool SPFA(int S, int T, int N, LL &Flow, LL &Cost) {
  for (int i = 0; i <= N; i++)
    Dist[i] = INF, pre[i] = -1, vis[i] = 0, cnt[i] = 0;
  queue<int> Q;
  Q.push(S);
  Dist[S] = 0, vis[S] = 1;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    vis[u] = 0;
    for (int i = Adj[u]; i != -1; i = E[i].Next) {
      int v = E[i].v, c = E[i].c;
      if (E[i].w && Dist[v] > Dist[u] + c) {
        Dist[v] = Dist[u] + c;
        pre[v] = i;
        if (!vis[v]) {
          ++cnt[v];
          vis[v] = 1, Q.push(v);
        }
      }
    }
  }
  if (Dist[T] == INF)
    return 0;
  LL Min = INF;
  for (int i = pre[T]; i != -1; i = pre[E[i ^ 1].v])
    Min = min(Min, (LL)E[i].w);
  for (int i = pre[T]; i != -1; i = pre[E[i ^ 1].v])
    E[i].w -= Min, E[i ^ 1].w += Min, Cost += Min * E[i].c;
  Flow += Min;
  return 1;
}
pair<LL, LL> Dinic(int S, int T, int N) {
  LL Flow = 0, Cost = 0;
  while (1)
    if (!SPFA(S, T, N, Flow, Cost))
      break;
  return make_pair(Flow, Cost);
}

#undef MAXN
#undef MAXM

#define MAXM 1000
int N, M, K;
int A[MAXM + 5];

int main() {
  N = read();
  ecnt = 0;
  memset(Adj, -1, sizeof Adj);
  for (int i = 1; i <= N; i++) {
    int x = read(), y = read(), c = read();
    AddEdge(1, i + 1, c, 0);
    AddEdge(i + 1, N + 2, INF, x + y);
    AddEdge(i + 1, N + 3, INF, -x + y);
    AddEdge(i + 1, N + 4, INF, x - y);
    AddEdge(i + 1, N + 5, INF, -x - y);
  }
  for (int i = 1; i <= N; i++) {
    int x = read(), y = read(), c = read();
    AddEdge(i + 5 + N, 2 * N + 6, c, 0);
    AddEdge(N + 2, i + 5 + N, INF, -x - y);
    AddEdge(N + 3, i + 5 + N, INF, x - y);
    AddEdge(N + 4, i + 5 + N, INF, -x + y);
    AddEdge(N + 5, i + 5 + N, INF, x + y);
  }
  printf("%lld", -Dinic(1, 2 * N + 6, 2 * N + 6).second);
  return 0;
}