Problem p01368 (C++) — buggy submission, verdict: Runtime Error

#define _USE_MATH_DEFINES

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;

typedef pair<long long int, long long int> P;

long long int INF = 1e18;
long long int MOD = 1e9 + 7;

long long int d[1000][1000];

void warshall_floyd(int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
}

struct edge {
  long long int to, cap, rev; //
};

#define MAX_V 2100

vector<edge> G[MAX_V] = {};
bool used[MAX_V];

//
void add_edge(long long int from, long long int to, long long int cap) {
  G[from].push_back((edge){to, cap, (long long int)G[to].size()});
  G[to].push_back((edge){from, 0, (long long int)G[from].size() - 1}); //
  // G[to].push_back((edge){from, cap, G[from].size() - 1}); //
}

//
long long int dfs(int v, int t, long long int f) {
  if (v == t) {
    return f;
  }
  used[v] = true;
  for (int i = 0; i < G[v].size(); i++) {
    edge &e = G[v][i];
    if (!used[e.to] && e.cap > 0) {
      long long int d = dfs(e.to, t, min(f, e.cap));
      if (d > 0) {
        e.cap -= d;
        G[e.to][e.rev].cap += d;
        return d;
      }
    }
  }
  return 0;
}

//
long long int max_flow(int s, int t) {
  long long int flow = 0;
  while (true) {
    fill(used, used + MAX_V, 0);
    long long int f = dfs(s, t, INF);
    if (f == 0) {
      return flow;
    }
    flow += f;
  }
}

int main() {
  while (true) {
    int N, M, L;
    cin >> N >> M >> L;
    if (N == 0) {
      break;
    }
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
        d[i][j] = INF;
      }
      d[i][i] = 0;
    }
    for (int i = 0; i < M; i++) {
      int u, v, d_;
      cin >> u >> v >> d_;
      d[u][v] = d[v][u] = d_;
    }
    warshall_floyd(N);
    long long int p[1100], t[1100];
    for (int i = 0; i < L; i++) {
      cin >> p[i] >> t[i];
    }
    for (int i = 0; i < MAX_V; i++) {
      G[i].clear();
    }
    for (int i = 1; i <= L; i++) {
      add_edge(0, i, 1);
      add_edge(i + L, 2 * L + 1, 1);
    }
    for (int i = 0; i < L; i++) {
      for (int j = 0; j < L; j++) {
        if (i != j && t[j] - t[i] >= d[p[i]][p[j]]) {
          add_edge(i + 1, j + 1 + L, 1);
        }
      }
    }
    cout << L - max_flow(0, 2 * L + 1) << endl;
  }
  return 0;
}


Error: 0

Fixed submission:

#define _USE_MATH_DEFINES

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;

typedef pair<long long int, long long int> P;

long long int INF = 1e18;
long long int MOD = 1e9 + 7;

#define MAX_V 1000

long long int d[MAX_V][MAX_V];

void warshall_floyd(int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
}

struct edge {
  long long int to, cap, rev; //
};

vector<edge> G[MAX_V] = {};
bool used[MAX_V];

//
void add_edge(long long int from, long long int to, long long int cap) {
  G[from].push_back((edge){to, cap, (long long int)G[to].size()});
  G[to].push_back((edge){from, 0, (long long int)G[from].size() - 1}); //
  // G[to].push_back((edge){from, cap, G[from].size() - 1}); //
}

//
long long int dfs(int v, int t, long long int f) {
  if (v == t) {
    return f;
  }
  used[v] = true;
  for (int i = 0; i < G[v].size(); i++) {
    edge &e = G[v][i];
    if (!used[e.to] && e.cap > 0) {
      long long int d = dfs(e.to, t, min(f, e.cap));
      if (d > 0) {
        e.cap -= d;
        G[e.to][e.rev].cap += d;
        return d;
      }
    }
  }
  return 0;
}

//
long long int max_flow(int s, int t) {
  long long int flow = 0;
  while (true) {
    fill(used, used + MAX_V, 0);
    long long int f = dfs(s, t, INF);
    if (f == 0) {
      return flow;
    }
    flow += f;
  }
}

int main() {
  while (true) {
    int N, M, L;
    cin >> N >> M >> L;
    if (N == 0) {
      break;
    }
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
        d[i][j] = INF;
      }
      d[i][i] = 0;
    }
    for (int i = 0; i < M; i++) {
      int u, v, d_;
      cin >> u >> v >> d_;
      d[u][v] = d[v][u] = d_;
    }
    warshall_floyd(N);
    long long int p[1100], t[1100];
    for (int i = 0; i < L; i++) {
      cin >> p[i] >> t[i];
    }
    for (int i = 0; i < MAX_V; i++) {
      G[i].clear();
    }
    for (int i = 1; i <= L; i++) {
      add_edge(0, i, 1);
      add_edge(i + L, 2 * L + 1, 1);
    }
    for (int i = 0; i < L; i++) {
      for (int j = 0; j < L; j++) {
        if (i != j && t[j] - t[i] >= d[p[i]][p[j]]) {
          add_edge(i + 1, j + 1 + N, 1);
        }
      }
    }
    cout << L - max_flow(0, 2 * L + 1) << endl;
  }
  return 0;
}