Problem p03837 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
#define repr(i, a, b)                                                          \
  for (long long i = (long long)(a); i < (long long)(b); i++)
#define rep(i, n) repr(i, 0, n)
#define reprrev(i, a, b) for (int i = (int)(b)-1; i >= (int)(a); i--)
#define reprev(i, n) reprrev(i, 0, n)
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define mp make_pair
#define mt make_tuple
#define MOD 1000000007
#define PI 3.1415926535
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<Pi> vPi;
typedef vector<Pll> vPll;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef vector<vector<ll>> vvll;
typedef vector<vector<char>> vvc;
typedef vector<vector<string>> vvs;
typedef vector<vector<double>> vvd;
typedef vector<vector<Pi>> vvPi;
typedef priority_queue<int, vector<int>, greater<int>> pqli;
typedef priority_queue<ll, vector<ll>, greater<ll>> pqlll;
typedef priority_queue<Pi, vector<Pi>, greater<Pi>> pqlP;
string YN(bool y) { return (y ? "YES" : "NO"); }
string yn(bool y) { return (y ? "Yes" : "No"); }
string ON(bool y) { return (y ? "OK" : "NG"); }
vvll cost;
// Dijkstra法(cost[i][j]は節点iから節点jへのコスト，startは始点番号，nは節点数)
vector<int> Dijkstra(int start, int n) {
  vector<int> dist(n, 1e9); // dist[i]はstartからiへの最短コスト
  vector<bool> used(
      n, true); // used[i]はstartから節点iへのコストが未確定か否かを示す
  vector<int> prev(n, 1e9); // prev[i]は節点iへ繋ぐ節点番号を格納

  // 始点のコストは0
  dist[start] = 0;
  for (int i = 0; i < n; i++) {
    // 節点コストが確定していない点の中で，startからのコストが最小の節点min_jを求める
    int min = 1e9 + 1, min_j;
    for (int j = 0; j < n; j++) {
      if (min > dist[j] && used[j]) {
        min = dist[j];
        min_j = j;
      }
    }
    // 節点min_jのコストを決定する
    used[min_j] = false;
    for (int j = 0; j < n; j++) {
      if (dist[j] > dist[min_j] + cost[min_j][j] && used[j]) {
        dist[j] = dist[min_j] + cost[min_j][j];
        prev[j] = min_j;
      }
    }
  }
  return prev;
}
int main(void) {
  ll n, m;

  cin >> n >> m;

  cost = vvll(n, vll(n, 1e18));

  vvb flag(n, vb(n, true));

  vi prev;

  rep(i, m) {
    ll a, b, c;
    cin >> a >> b >> c;
    cost[a - 1][b - 1] = c;
    cost[b - 1][a - 1] = c;
    flag[a - 1][b - 1] = false;
    flag[b - 1][a - 1] = false;
  }

  rep(i, n) {
    prev = Dijkstra(i, n);

    rep(i, n) {
      flag[i][prev[i]] = true;
      flag[prev[i]][i] = true;
    }
  }

  ll ans = 0;
  rep(i, n) {
    repr(j, i + 1, n) {
      if (!flag[i][j])
        ans++;
    }
  }
  cout << ans << endl;
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
#define repr(i, a, b)                                                          \
  for (long long i = (long long)(a); i < (long long)(b); i++)
#define rep(i, n) repr(i, 0, n)
#define reprrev(i, a, b) for (int i = (int)(b)-1; i >= (int)(a); i--)
#define reprev(i, n) reprrev(i, 0, n)
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define mp make_pair
#define mt make_tuple
#define MOD 1000000007
#define PI 3.1415926535
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<Pi> vPi;
typedef vector<Pll> vPll;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef vector<vector<ll>> vvll;
typedef vector<vector<char>> vvc;
typedef vector<vector<string>> vvs;
typedef vector<vector<double>> vvd;
typedef vector<vector<Pi>> vvPi;
typedef priority_queue<int, vector<int>, greater<int>> pqli;
typedef priority_queue<ll, vector<ll>, greater<ll>> pqlll;
typedef priority_queue<Pi, vector<Pi>, greater<Pi>> pqlP;
string YN(bool y) { return (y ? "YES" : "NO"); }
string yn(bool y) { return (y ? "Yes" : "No"); }
string ON(bool y) { return (y ? "OK" : "NG"); }
vvll cost;
// Dijkstra法(cost[i][j]は節点iから節点jへのコスト，startは始点番号，nは節点数)
vector<int> Dijkstra(int start, int n) {
  vector<int> dist(n, 1e9); // dist[i]はstartからiへの最短コスト
  vector<bool> used(
      n, true); // used[i]はstartから節点iへのコストが未確定か否かを示す
  vector<int> prev(n, 1e9); // prev[i]は節点iへ繋ぐ節点番号を格納

  // 始点のコストは0
  dist[start] = 0;
  for (int i = 0; i < n; i++) {
    // 節点コストが確定していない点の中で，startからのコストが最小の節点min_jを求める
    int min = 1e9 + 1, min_j;
    for (int j = 0; j < n; j++) {
      if (min > dist[j] && used[j]) {
        min = dist[j];
        min_j = j;
      }
    }
    // 節点min_jのコストを決定する
    used[min_j] = false;
    for (int j = 0; j < n; j++) {
      if (dist[j] > dist[min_j] + cost[min_j][j] && used[j]) {
        dist[j] = dist[min_j] + cost[min_j][j];
        prev[j] = min_j;
      }
    }
  }
  return prev;
}
int main(void) {
  ll n, m;

  cin >> n >> m;

  cost = vvll(n, vll(n, 1e18));

  vvb flag(n, vb(n, true));

  vi prev;

  rep(i, m) {
    ll a, b, c;
    cin >> a >> b >> c;
    cost[a - 1][b - 1] = c;
    cost[b - 1][a - 1] = c;
    flag[a - 1][b - 1] = false;
    flag[b - 1][a - 1] = false;
  }

  rep(i, n) {
    prev = Dijkstra(i, n);

    rep(i, n) {
      if (prev[i] != 1e9) {
        flag[i][prev[i]] = true;
        flag[prev[i]][i] = true;
      }
    }
  }

  ll ans = 0;
  rep(i, n) {
    repr(j, i + 1, n) {
      if (!flag[i][j])
        ans++;
    }
  }
  cout << ans << endl;
}