Problem p03722 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;

// 隣接リストで使う辺を表す型
struct Edge {
  long long to, cost; // 辺の接続先頂点, 辺の重み
  Edge(long long to, long long cost) : to(to), cost(cost) {} // コンストラクタ
};

typedef vector<vector<Edge>> AdjList; // 隣接リストの型
AdjList graph;                        // グラフの辺を格納した構造体
// graph[v][i]は頂点vから出るi番目の辺Edge

const long long INF = 922337203685477580;

vector<long long> dist; // 最短距離
vector<bool> neg;       // 閉路を含むか

// 戻り値がtrueなら負の閉路を含む
bool bellman_ford(long long n, long long s) { // nは頂点数、sは開始頂点
  dist = vector<long long>(n, INF);
  neg = vector<bool>(n, false);
  dist[s] = 0; // 開始点の距離は0
  for (long long i = 0; i < n; i++) {
    for (long long v = 0; v < n; v++) {
      for (long long k = 0; k < graph[v].size(); k++) {
        Edge e = graph[v][k];
        if (dist[v] != INF && dist[e.to] > dist[v] + e.cost) {
          dist[e.to] = dist[v] + e.cost;
          if (i == n - 1) {
            neg[e.to] = true;
            return true; // n回目にも更新があるなら負の閉路が存在
          }
        }
      }
    }
  }
  return false;
}

int main() {
  long long n, m;
  cin >> n >> m;
  n++;

  graph = AdjList(n);

  for (long long i = 0; i < m; i++) {
    long long from, to, cost;
    cin >> from >> to >> cost;
    cost *= -1; // コストを-1倍することで最長経路を求める
    graph[from].push_back(Edge(to, cost));
  }

  bool heiro = false;
  for (int i = 0; i < 4000; i++) {
    for (size_t j = 0; j < graph.size(); j++) {
      for (size_t k = 0; k < graph[j].size(); k++) {
        if (neg[j])
          neg[graph[j][k].to] = true;
      }
    }
  }

  if (neg[n - 1]) {
    cout << "inf" << endl;
  } else {
    cout << -(dist[n - 1]) << endl;
  }

  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;

// 隣接リストで使う辺を表す型
struct Edge {
  long long to, cost; // 辺の接続先頂点, 辺の重み
  Edge(long long to, long long cost) : to(to), cost(cost) {} // コンストラクタ
};

typedef vector<vector<Edge>> AdjList; // 隣接リストの型
AdjList graph;                        // グラフの辺を格納した構造体
// graph[v][i]は頂点vから出るi番目の辺Edge

const long long INF = 922337203685477580;

vector<long long> dist; // 最短距離
vector<bool> neg;       // 閉路を含むか

// 戻り値がtrueなら負の閉路を含む
bool bellman_ford(long long n, long long s) { // nは頂点数、sは開始頂点
  dist = vector<long long>(n, INF);
  neg = vector<bool>(n, false);
  dist[s] = 0; // 開始点の距離は0
  for (long long i = 0; i < n; i++) {
    for (long long v = 0; v < n; v++) {
      for (long long k = 0; k < graph[v].size(); k++) {
        Edge e = graph[v][k];
        if (dist[v] != INF && dist[e.to] > dist[v] + e.cost) {
          dist[e.to] = dist[v] + e.cost;
          if (i == n - 1) {
            neg[e.to] = true;
            return true; // n回目にも更新があるなら負の閉路が存在
          }
        }
      }
    }
  }
  return false;
}

int main() {
  long long n, m;
  cin >> n >> m;
  n++;

  graph = AdjList(n);

  for (long long i = 0; i < m; i++) {
    long long from, to, cost;
    cin >> from >> to >> cost;
    cost *= -1; // コストを-1倍することで最長経路を求める
    graph[from].push_back(Edge(to, cost));
  }

  bellman_ford(n, 1);
  for (int i = 0; i < 4000; i++) {
    for (size_t j = 0; j < graph.size(); j++) {
      for (size_t k = 0; k < graph[j].size(); k++) {
        if (neg[j])
          neg[graph[j][k].to] = true;
      }
    }
  }

  if (neg[n - 1]) {
    cout << "inf" << endl;
  } else {
    cout << -(dist[n - 1]) << endl;
  }

  return 0;
}