Problem p03722 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
/*{{{*/ // template
#define rep(i, n) for (int i = 0; i < n; i++)
constexpr int INF = numeric_limits<int>::max() / 2;
constexpr long long LINF = numeric_limits<long long>::max() / 3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr << #x << ":" << x << endl
#define debug2(x, y) cerr << #x << "," << #y ":" << x << "," << y << endl
// struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double {
  double d;
  explicit Double(double x) : d(x) {}
};
ostream &operator<<(ostream &os, const Double x) {
  os << fixed << setprecision(20) << x.d;
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << "," << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  for (T v : st)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T, typename U> inline void chmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <typename T, typename U> inline void chmin(T &x, U y) {
  if (y < x)
    x = y;
}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
// constexpr double eps = 1e-14;
constexpr double eps = 1e-10;
constexpr ll mod = 1e9 + 7;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
/*}}}*/

struct edge {
  long long from, to, cost;
  edge() {}
  edge(long long f, long long t, long long c) : from(f), to(t), cost(c) {}
};

bool find_negative_path(int s, int t, const vector<edge> &es, int V, int E) {
  constexpr long long inf = 1ll << 60;
  vector<long long> d(V, inf);
  d[s] = 0;
  for (int i = 0; i <= 2 * V; i++) {
    for (const edge &e : es) {
      if (d[e.from] != inf && d[e.to] > d[e.from] + e.cost) {
        d[e.to] = d[e.from] + e.cost;
        if (i >= V - 1 and e.to == t) {
          return true;
        }
      }
    }
  }
  return false;
}

vector<long long> bellman_ford(int s, const vector<edge> &es, int V, int E) {
  constexpr long long inf = 1ll << 60;
  vector<long long> d(V, inf);
  d[s] = 0;

  int cnt = 0;
  while (true) {
    if (cnt++ == 2 * V)
      assert(false);
    bool update = false;
    for (const edge &e : es) {
      if (d[e.from] != inf && d[e.to] > d[e.from] + e.cost) {
        d[e.to] = d[e.from] + e.cost;
        update = true;
      }
    }
    if (!update)
      break;
  }
  return d;
}

int main() {
  int N, M;
  cin >> N >> M;
  vector<edge> es;
  rep(i, M) {
    long long a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    es.pb(edge(a, b, -c));
  }

  if (find_negative_path(0, N - 1, es, N, M)) {
    cout << "inf" << endl;
  } else {
    auto d = bellman_ford(0, es, N, M);
    cout << -d[N - 1] << endl;
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
/*{{{*/ // template
#define rep(i, n) for (int i = 0; i < n; i++)
constexpr int INF = numeric_limits<int>::max() / 2;
constexpr long long LINF = numeric_limits<long long>::max() / 3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr << #x << ":" << x << endl
#define debug2(x, y) cerr << #x << "," << #y ":" << x << "," << y << endl
// struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double {
  double d;
  explicit Double(double x) : d(x) {}
};
ostream &operator<<(ostream &os, const Double x) {
  os << fixed << setprecision(20) << x.d;
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << "," << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  for (T v : st)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T, typename U> inline void chmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <typename T, typename U> inline void chmin(T &x, U y) {
  if (y < x)
    x = y;
}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
// constexpr double eps = 1e-14;
constexpr double eps = 1e-10;
constexpr ll mod = 1e9 + 7;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
/*}}}*/

struct edge {
  long long from, to, cost;
  edge() {}
  edge(long long f, long long t, long long c) : from(f), to(t), cost(c) {}
};

bool find_negative_path(int s, int t, const vector<edge> &es, int V, int E) {
  constexpr long long inf = 1ll << 60;
  vector<long long> d(V, inf);
  d[s] = 0;
  for (int i = 0; i <= 2 * V; i++) {
    for (const edge &e : es) {
      if (d[e.from] != inf && d[e.to] > d[e.from] + e.cost) {
        d[e.to] = d[e.from] + e.cost;
        if (i >= V - 1 and e.to == t) {
          return true;
        }
      }
    }
  }
  return false;
}

vector<long long> bellman_ford(int s, const vector<edge> &es, int V, int E) {
  constexpr long long inf = 1ll << 60;
  vector<long long> d(V, inf);
  d[s] = 0;

  int cnt = 0;
  while (true) {
    if (++cnt == V)
      break;
    bool update = false;
    for (const edge &e : es) {
      if (d[e.from] != inf && d[e.to] > d[e.from] + e.cost) {
        d[e.to] = d[e.from] + e.cost;
        update = true;
      }
    }
    if (!update)
      break;
  }
  return d;
}

int main() {
  int N, M;
  cin >> N >> M;
  vector<edge> es;
  rep(i, M) {
    long long a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    es.pb(edge(a, b, -c));
  }

  if (find_negative_path(0, N - 1, es, N, M)) {
    cout << "inf" << endl;
  } else {
    auto d = bellman_ford(0, es, N, M);
    cout << -d[N - 1] << endl;
  }
  return 0;
}