Problem p03837 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
typedef long long lint;
typedef vector<lint> liv;
// #define rep(i,n) for(int i=0;i<n;++i)
#define all(v) v.begin(), v.end()
#define linf 1152921504606846976
#define MAXN 70
#define md 1000000007 // 998244353

#define pb push_back
#define _vcppunko4(tuple) _getname4 tuple
#define _getname4(_1, _2, _3, _4, name, ...) name
#define _getname3(_1, _2, _3, name, ...) name
#define _trep2(tuple) _rep2 tuple
#define _trep3(tuple) _rep3 tuple
#define _trep4(tuple) _rep4 tuple
#define _rep1(n) for (lint i = 0; i < n; ++i)
#define _rep2(i, n) for (lint i = 0; i < n; ++i)
#define _rep3(i, a, b) for (lint i = a; i < b; ++i)
#define _rep4(i, a, b, c) for (lint i = a; i < b; i += c)
#define _trrep2(tuple) _rrep2 tuple
#define _trrep3(tuple) _rrep3 tuple
#define _trrep4(tuple) _rrep4 tuple
#define _rrep1(n) for (lint i = n - 1; i >= 0; --i)
#define _rrep2(i, n) for (lint i = n - 1; i >= 0; --i)
#define _rrep3(i, a, b) for (lint i = b - 1; i >= a; --i)
#define _rrep4(i, a, b, c)                                                     \
  for (lint i = a + (b - a - 1) / c * c; i >= a; i -= c)
template <class T> istream &operator>>(istream &is, vector<T> &vec);
template <class T, size_t size>
istream &operator>>(istream &is, array<T, size> &vec);
template <class T, class L> istream &operator>>(istream &is, pair<T, L> &p);
template <class T> ostream &operator<<(ostream &os, vector<T> &vec);
template <class T, class L> ostream &operator<<(ostream &os, pair<T, L> &p);
template <class T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
template <class T, class L> istream &operator>>(istream &is, pair<T, L> &p) {
  is >> p.first;
  is >> p.second;
  return is;
}
// template<class T>
// ostream& operator<<(ostream& os,vector<T>& vec){
// os<<vec[0];rep(i,1,vec.size())os<<' '<<vec[i];return os; } template<class T>
// ostream& operator<<(ostream& os,deque<T>& deq){
// os<<deq[0];rep(i,1,deq.size())os<<' '<<deq[i];return os; }
template <class T, class L> ostream &operator<<(ostream &os, pair<T, L> &p) {
  os << p.first << " " << p.second;
  return os;
}

inline void in() {}
template <class Head, class... Tail>
inline void in(Head &&head, Tail &&...tail) {
  cin >> head;
  in(move(tail)...);
}
template <class T> inline bool out(T t) {
  cout << t << '\n';
  return 0;
}
inline bool out() {
  cout << '\n';
  return 0;
}
template <class Head, class... Tail> inline bool out(Head head, Tail... tail) {
  cout << head << ' ';
  out(move(tail)...);
  return 0;
}

template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }

template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template <typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T &t, const V &v) {
  t = v;
}

template <typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T &t, const V &v) {
  for (auto &e : t)
    fill_v(e, v);
} // http://beet-aizu.hatenablog.com/entry/2018/04/08/145516

#define rep(...)                                                               \
  _vcppunko4((__VA_ARGS__, _trep4, _trep3, _trep2, _rep1))((__VA_ARGS__))
#define rrep(...)                                                              \
  _vcppunko4((__VA_ARGS__, _trrep4, _trrep3, _trrep2, _rrep1))((__VA_ARGS__))
#define lin(...)                                                               \
  lint __VA_ARGS__;                                                            \
  in(__VA_ARGS__)
#define stin(...)                                                              \
  string __VA_ARGS__;                                                          \
  in(__VA_ARGS__)
#define vin(type, name, size)                                                  \
  vector<type> name(size);                                                     \
  in(name)
#define fi i.first
#define se i.second
#define YES(c) cout << ((c) ? "YES\n" : "NO\n"), 0
#define Yes(c) cout << ((c) ? "Yes\n" : "No\n"), 0

#define inf linf

// pfs
// d,edge,g,P,q;

lint d[110][MAXN], prv[MAXN];
struct edge {
  int to;
  lint cost;
};
vector<edge> g[MAXN];
typedef pair<lint, int> P;
priority_queue<P, vector<P>, greater<P>> q;
set<lint> used;
int cur = 0;

void pfs(int s) {
  d[cur][s] = 0;
  q.push({0, s});
  lint cd, cv;
  while (q.size()) {
    cd = q.top().first;
    cv = q.top().second;
    q.pop();
    if (cd > d[cur][cv])
      continue;
    for (edge &e : g[cv])
      if (d[cur][e.to] > cd + e.cost) {
        d[cur][e.to] = cd + e.cost;
        prv[e.to] = cv;
        q.push({d[cur][e.to], e.to});
      }
  }
  return;
}

struct ed {
  lint c;
  int a, b;
};
vector<ed> edges;

int main() {
  lint v, e, ind;
  cin >> v >> e;
  int s, t;
  rep(e) {
    cin >> s >> t >> ind;
    --s, --t;
    edges.pb({ind, s, t});
    g[s].push_back({t, ind});
    g[t].push_back({s, ind});
  }
  rep(v) {
    cur = i;
    fill(d[i], d[i] + v, inf);
    pfs(i);
  }
  lint ans = 0;
  for (auto i : edges) {
    if (d[i.a][i.b] < i.c)
      ++ans;
  }
  cout << ans << endl;

} // http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A

// sub-EOF


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
typedef long long lint;
typedef vector<lint> liv;
// #define rep(i,n) for(int i=0;i<n;++i)
#define all(v) v.begin(), v.end()
#define linf 1152921504606846976
#define MAXN 110
#define md 1000000007 // 998244353

#define pb push_back
#define _vcppunko4(tuple) _getname4 tuple
#define _getname4(_1, _2, _3, _4, name, ...) name
#define _getname3(_1, _2, _3, name, ...) name
#define _trep2(tuple) _rep2 tuple
#define _trep3(tuple) _rep3 tuple
#define _trep4(tuple) _rep4 tuple
#define _rep1(n) for (lint i = 0; i < n; ++i)
#define _rep2(i, n) for (lint i = 0; i < n; ++i)
#define _rep3(i, a, b) for (lint i = a; i < b; ++i)
#define _rep4(i, a, b, c) for (lint i = a; i < b; i += c)
#define _trrep2(tuple) _rrep2 tuple
#define _trrep3(tuple) _rrep3 tuple
#define _trrep4(tuple) _rrep4 tuple
#define _rrep1(n) for (lint i = n - 1; i >= 0; --i)
#define _rrep2(i, n) for (lint i = n - 1; i >= 0; --i)
#define _rrep3(i, a, b) for (lint i = b - 1; i >= a; --i)
#define _rrep4(i, a, b, c)                                                     \
  for (lint i = a + (b - a - 1) / c * c; i >= a; i -= c)
template <class T> istream &operator>>(istream &is, vector<T> &vec);
template <class T, size_t size>
istream &operator>>(istream &is, array<T, size> &vec);
template <class T, class L> istream &operator>>(istream &is, pair<T, L> &p);
template <class T> ostream &operator<<(ostream &os, vector<T> &vec);
template <class T, class L> ostream &operator<<(ostream &os, pair<T, L> &p);
template <class T> istream &operator>>(istream &is, vector<T> &vec) {
  for (T &x : vec)
    is >> x;
  return is;
}
template <class T, class L> istream &operator>>(istream &is, pair<T, L> &p) {
  is >> p.first;
  is >> p.second;
  return is;
}
// template<class T>
// ostream& operator<<(ostream& os,vector<T>& vec){
// os<<vec[0];rep(i,1,vec.size())os<<' '<<vec[i];return os; } template<class T>
// ostream& operator<<(ostream& os,deque<T>& deq){
// os<<deq[0];rep(i,1,deq.size())os<<' '<<deq[i];return os; }
template <class T, class L> ostream &operator<<(ostream &os, pair<T, L> &p) {
  os << p.first << " " << p.second;
  return os;
}

inline void in() {}
template <class Head, class... Tail>
inline void in(Head &&head, Tail &&...tail) {
  cin >> head;
  in(move(tail)...);
}
template <class T> inline bool out(T t) {
  cout << t << '\n';
  return 0;
}
inline bool out() {
  cout << '\n';
  return 0;
}
template <class Head, class... Tail> inline bool out(Head head, Tail... tail) {
  cout << head << ' ';
  out(move(tail)...);
  return 0;
}

template <typename T> vector<T> make_v(size_t a) { return vector<T>(a); }

template <typename T, typename... Ts> auto make_v(size_t a, Ts... ts) {
  return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template <typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T &t, const V &v) {
  t = v;
}

template <typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T &t, const V &v) {
  for (auto &e : t)
    fill_v(e, v);
} // http://beet-aizu.hatenablog.com/entry/2018/04/08/145516

#define rep(...)                                                               \
  _vcppunko4((__VA_ARGS__, _trep4, _trep3, _trep2, _rep1))((__VA_ARGS__))
#define rrep(...)                                                              \
  _vcppunko4((__VA_ARGS__, _trrep4, _trrep3, _trrep2, _rrep1))((__VA_ARGS__))
#define lin(...)                                                               \
  lint __VA_ARGS__;                                                            \
  in(__VA_ARGS__)
#define stin(...)                                                              \
  string __VA_ARGS__;                                                          \
  in(__VA_ARGS__)
#define vin(type, name, size)                                                  \
  vector<type> name(size);                                                     \
  in(name)
#define fi i.first
#define se i.second
#define YES(c) cout << ((c) ? "YES\n" : "NO\n"), 0
#define Yes(c) cout << ((c) ? "Yes\n" : "No\n"), 0

#define inf linf

// pfs
// d,edge,g,P,q;

lint d[110][MAXN], prv[MAXN];
struct edge {
  int to;
  lint cost;
};
vector<edge> g[MAXN];
typedef pair<lint, int> P;
priority_queue<P, vector<P>, greater<P>> q;
set<lint> used;
int cur = 0;

void pfs(int s) {
  d[cur][s] = 0;
  q.push({0, s});
  lint cd, cv;
  while (q.size()) {
    cd = q.top().first;
    cv = q.top().second;
    q.pop();
    if (cd > d[cur][cv])
      continue;
    for (edge &e : g[cv])
      if (d[cur][e.to] > cd + e.cost) {
        d[cur][e.to] = cd + e.cost;
        prv[e.to] = cv;
        q.push({d[cur][e.to], e.to});
      }
  }
  return;
}

struct ed {
  lint c;
  int a, b;
};
vector<ed> edges;

int main() {
  lint v, e, ind;
  cin >> v >> e;
  int s, t;
  rep(e) {
    cin >> s >> t >> ind;
    --s, --t;
    edges.pb({ind, s, t});
    g[s].push_back({t, ind});
    g[t].push_back({s, ind});
  }
  rep(v) {
    cur = i;
    fill(d[i], d[i] + v, inf);
    pfs(i);
  }
  lint ans = 0;
  for (auto i : edges) {
    if (d[i.a][i.b] < i.c)
      ++ans;
  }
  cout << ans << endl;

} // http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A

// sub-EOF