Problem p03020 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000;
const int maxm = 8e3;
const ll inf = 1e18;
const ll mx = 3e9;
struct edge {
  int to;
  ll c;
  ll f;
  ll w;
  int nxt;
} e[maxm + 10];
int head[maxm + 10];
int tot;
int n;
int S, T;
void addedge(int u, int v, ll w, ll c) {
  // cout<<u << v << w<< c<<endl;
  e[tot].to = v;
  e[tot].w = w;
  e[tot].c = c;
  e[tot].nxt = head[u];
  head[u] = tot++;

  e[tot].to = u;
  e[tot].w = -w;
  e[tot].c = 0;
  e[tot].nxt = head[v];
  head[v] = tot++;
}

ll dis[maxm + 10];
bool vis[maxm + 10];
int pre[maxm + 10];
bool spfa() {
  for (int i = 0; i <= T; i++)
    dis[i] = inf;
  // memset(dis,inf,0,sizeof(dis));
  memset(pre, -1, sizeof(pre));
  memset(vis, false, sizeof(vis));
  dis[S] = 0;
  vis[S] = true;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis[u] = false;
    for (int i = head[u]; i != -1; i = e[i].nxt) {
      int v = e[i].to;
      if (e[i].c) {
        if (dis[u] + e[i].w < dis[v]) {
          dis[v] = dis[u] + e[i].w;
          pre[v] = i;
          if (!vis[v]) {
            vis[v] = true;
            q.push(v);
          }
        }
      }
    }
  }
  return dis[T] != inf;
}

ll MCMF() {
  ll ret = 0;
  while (spfa()) {
    ll flow = inf;
    for (int i = T; i != S; i = e[pre[i] ^ 1].to) {
      flow = min(e[pre[i]].c, flow);
    }
    for (int i = T; i != S; i = e[pre[i] ^ 1].to) {
      e[pre[i]].c -= flow;
      e[pre[i] ^ 1].c += flow;
      ret += e[pre[i]].w * flow;
    }
  }
  return ret;
}

int main() {
  while (~scanf("%d", &n)) {
    tot = 0;
    memset(head, -1, sizeof(head));
    S = 1, T = S + 2 * n + 5;
    for (int i = 1; i <= n; i++) {
      int x, y, c;
      scanf("%d%d%d", &x, &y, &c);
      addedge(S, S + i, 0, c);
      addedge(S + i, S + n + 1, x + y, c);
      addedge(S + i, S + n + 2, x - y, c);
      addedge(S + i, S + n + 3, -x + y, c);
      addedge(S + i, S + n + 4, -x - y, c);
    }

    for (int i = 1; i <= n; i++) {
      int x, y, c;
      scanf("%d%d%d", &x, &y, &c);
      addedge(S + n + 4 + i, T, 0, c);
      addedge(S + n + 1, S + n + 4 + i, -x - y, c);
      addedge(S + n + 2, S + n + 4 + i, -x + y, c);
      addedge(S + n + 3, S + n + 4 + i, x - y, c);
      addedge(S + n + 4, S + n + 4 + i, x + y, c);
    }

    printf("%lld\n", -MCMF());
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000;
const int maxm = 8e3;
const ll inf = 1e18;
const ll mx = 3e9;
struct edge {
  int to;
  ll c;
  ll f;
  ll w;
  int nxt;
} e[31000];
int head[maxm + 10];
int tot;
int n;
int S, T;
void addedge(int u, int v, ll w, ll c) {
  // cout<<u << v << w<< c<<endl;
  e[tot].to = v;
  e[tot].w = w;
  e[tot].c = c;
  e[tot].nxt = head[u];
  head[u] = tot++;

  e[tot].to = u;
  e[tot].w = -w;
  e[tot].c = 0;
  e[tot].nxt = head[v];
  head[v] = tot++;
}

ll dis[maxm + 10];
bool vis[maxm + 10];
int pre[maxm + 10];
bool spfa() {
  for (int i = 0; i <= T; i++)
    dis[i] = inf;
  // memset(dis,inf,0,sizeof(dis));
  memset(pre, -1, sizeof(pre));
  memset(vis, false, sizeof(vis));
  dis[S] = 0;
  vis[S] = true;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis[u] = false;
    for (int i = head[u]; i != -1; i = e[i].nxt) {
      int v = e[i].to;
      if (e[i].c) {
        if (dis[u] + e[i].w < dis[v]) {
          dis[v] = dis[u] + e[i].w;
          pre[v] = i;
          if (!vis[v]) {
            vis[v] = true;
            q.push(v);
          }
        }
      }
    }
  }
  return dis[T] != inf;
}

ll MCMF() {
  ll ret = 0;
  while (spfa()) {
    ll flow = inf;
    for (int i = T; i != S; i = e[pre[i] ^ 1].to) {
      flow = min(e[pre[i]].c, flow);
    }
    for (int i = T; i != S; i = e[pre[i] ^ 1].to) {
      e[pre[i]].c -= flow;
      e[pre[i] ^ 1].c += flow;
      ret += e[pre[i]].w * flow;
    }
  }
  return ret;
}

int main() {
  while (~scanf("%d", &n)) {
    tot = 0;
    memset(head, -1, sizeof(head));
    S = 1, T = S + 2 * n + 5;
    for (int i = 1; i <= n; i++) {
      int x, y, c;
      scanf("%d%d%d", &x, &y, &c);
      addedge(S, S + i, 0, c);
      addedge(S + i, S + n + 1, x + y, c);
      addedge(S + i, S + n + 2, x - y, c);
      addedge(S + i, S + n + 3, -x + y, c);
      addedge(S + i, S + n + 4, -x - y, c);
    }

    for (int i = 1; i <= n; i++) {
      int x, y, c;
      scanf("%d%d%d", &x, &y, &c);
      addedge(S + n + 4 + i, T, 0, c);
      addedge(S + n + 1, S + n + 4 + i, -x - y, c);
      addedge(S + n + 2, S + n + 4 + i, -x + y, c);
      addedge(S + n + 3, S + n + 4 + i, x - y, c);
      addedge(S + n + 4, S + n + 4 + i, x + y, c);
    }

    printf("%lld\n", -MCMF());
  }
  return 0;
}