Problem p03837 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

#define FOR(i, f, n) for (int(i) = (f); (i) < (n); (i)++)
#define RFOR(i, f, n) for (int(i) = (f); (i) >= (n); (i)--)
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define rrep(i, n) for (int(i) = (n); (i) >= 0; (i)--)
#define step(i, f, n, a) for (int(i) = (f); (i) < (n); (i) += a)
#define rstep(i, f, n, a) for (int(i) = (f); (i) >= (n); (i) -= a)
#define p(...)                                                                 \
  printf(__VA_ARGS__);                                                         \
  cout << endl;
#define gets(x)                                                                \
  x;                                                                           \
  cin >> x;
#define puts(x)                                                                \
  x;                                                                           \
  cout << x << endl;
#define list_input(x, n)                                                       \
  x[(n)];                                                                      \
  for (int(i) = 0; (i) < (n); (i)++)                                           \
    cin >> x[i];
#define lambda(a, b, c) [](const a, const b) { return c; }
#define key(t, x, compare)                                                     \
  [](const t &a, const t &b) { return a x compare b x; }

using namespace std;

using pii = pair<int, int>;
// ダイクストラプログラム例
// http://www.ss.cs.meiji.ac.jp/CCP024.html
// ワーシャルフロイドプログラム例
// http://pakapa104.hatenablog.com/entry/2016/02/05/225241

int main() {
  int n, m, MAX = 99999999;
  gets(n) gets(m) int a[n], b[n], c[n];
  for (int i = 0; i < n; ++i) {
    cin >> a[i] >> b[i] >> c[i];
    a[i] -= 1;
    b[i] -= 1; // indexのずれ
  }
  int dist[n][n]; // 最短経路格納

  rep(i, n) { // iからjまでの最短経路、塗りつぶし
    rep(j, n) { dist[i][j] = MAX; }
    dist[i][i] = 0;
  }
  rep(i, m) { // 辺の距離を与えらた数で初期化
    dist[a[i]][b[i]] = min(dist[a[i]][b[i]], c[i]);
    dist[b[i]][a[i]] = min(dist[b[i]][a[i]], c[i]);
  }
  rep(k, n) { // ワーシャルフロイド
    rep(i, n) {
      rep(j, n) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); }
    }
  }
  int result = 0;
  // 2点間を結ぶ辺よりも小さいコストで移動できる→
  // その辺は最短経路には使われない
  rep(i, m) {
    if (dist[a[i]][b[i]] < c[i]) {
      result += 1;
    }
  }
  puts(result)
}


Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

#define FOR(i, f, n) for (int(i) = (f); (i) < (n); (i)++)
#define RFOR(i, f, n) for (int(i) = (f); (i) >= (n); (i)--)
#define rep(i, n) for (int(i) = 0; (i) < (n); (i)++)
#define rrep(i, n) for (int(i) = (n); (i) >= 0; (i)--)
#define step(i, f, n, a) for (int(i) = (f); (i) < (n); (i) += a)
#define rstep(i, f, n, a) for (int(i) = (f); (i) >= (n); (i) -= a)
#define p(...)                                                                 \
  printf(__VA_ARGS__);                                                         \
  cout << endl;
#define gets(x)                                                                \
  x;                                                                           \
  cin >> x;
#define puts(x)                                                                \
  x;                                                                           \
  cout << x << endl;
#define list_input(x, n)                                                       \
  x[(n)];                                                                      \
  for (int(i) = 0; (i) < (n); (i)++)                                           \
    cin >> x[i];
#define lambda(a, b, c) [](const a, const b) { return c; }
#define key(t, x, compare)                                                     \
  [](const t &a, const t &b) { return a x compare b x; }

using namespace std;

using pii = pair<int, int>;
// ダイクストラプログラム例
// http://www.ss.cs.meiji.ac.jp/CCP024.html
// ワーシャルフロイドプログラム例
// http://pakapa104.hatenablog.com/entry/2016/02/05/225241

int main() {
  int n, m, MAX = 99999999;
  gets(n) gets(m) int a[m], b[m], c[m];
  for (int i = 0; i < m; ++i) {
    cin >> a[i] >> b[i] >> c[i];
    a[i] -= 1;
    b[i] -= 1; // indexのずれ
  }
  int dist[n][n]; // 最短経路格納

  rep(i, n) { // iからjまでの最短経路、塗りつぶし
    rep(j, n) { dist[i][j] = MAX; }
    dist[i][i] = 0;
  }
  rep(i, m) { // 辺の距離を与えらた数で初期化
    dist[a[i]][b[i]] = min(dist[a[i]][b[i]], c[i]);
    dist[b[i]][a[i]] = min(dist[b[i]][a[i]], c[i]);
  }
  rep(k, n) { // ワーシャルフロイド
    rep(i, n) {
      rep(j, n) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); }
    }
  }
  int result = 0;
  // 2点間を結ぶ辺よりも小さいコストで移動できる→
  // その辺は最短経路には使われない
  rep(i, m) {
    if (dist[a[i]][b[i]] < c[i]) {
      result += 1;
    }
  }
  puts(result)
}