Problem p02703 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define REP(i, n) for (int i = 0; i < n; i++)
#define ALL(a) (a).begin(), (a).end()
typedef vector<int> vi;
const int INF = 1LL << 60; // 10e18+10e17ちょっとくらい
const int MOD = 1000000007;
const int MAX_N = 200100;

struct edge {
  int to_node_idx;
  int to_money_idx;
  int cost;
};

// <コスト, 頂点の番号, 残高>
using P = pair<int, pair<int, int>>;

int N;                    // ノード数
vector<edge> G[51][2510]; // グラフ 都市番号と残高
int d[51][2510];          // 最小コストを保存する配列

void dijkstra(int s) {
  priority_queue<P, vector<P>, greater<P>> que; // vector<P>の形でコスト昇順
  REP(i, N)                                     // コストをINFで初期化
  {
    REP(j, 2510) { d[i][j] = INF; }
  }
  d[0][s] = 0;                             // 初期値へのコストは0
  que.push(make_pair(0, make_pair(0, s))); // 初期値<コスト、頂点番号>

  while (!que.empty()) {
    P p = que.top();
    que.pop();
    int node = p.second.first;
    int money = p.second.second;
    if (d[node][money] < p.first)
      continue;

    for (int i = 0; i < G[node][money].size(); ++i) // vからいけるところ
    {
      edge e = G[node][money][i];
      if (d[e.to_node_idx][e.to_money_idx] >
          d[node][money] + e.cost) // コストが更新できればqueueに追加
      {
        d[e.to_node_idx][e.to_money_idx] = d[node][money] + e.cost;
        que.push(make_pair(d[e.to_node_idx][e.to_money_idx],
                           make_pair(e.to_node_idx, e.to_money_idx)));
      }
    }
  }
}

signed main() {
  //  以降 cin の入力元が 'input.txt' になる
  // std::ifstream in("input.txt");
  // std::cin.rdbuf(in.rdbuf());
  int M, S;
  cin >> N >> M >> S;
  S = min(S, 2500LL);
  REP(i, M) {
    int u, v, a, b;
    cin >> u >> v >> a >> b;
    u--;
    v--;
    REP(money, 2501) {
      if (money >= a) // 残高があれば移動できる
      {
        edge e = {v, money - a, b};
        G[u][money].push_back(e);
      }
    }
    REP(money, 2501) {
      if (money >= a) // 残高があれば移動できる
      {
        edge e = {u, money - a, b};
        G[v][money].push_back(e);
      }
    }
  }
  REP(i, N) {
    int c, d;
    cin >> c >> d;
    REP(money, 2501) {
      edge e = {i, min(2500LL, money + c), d};
      G[i][money].push_back(e);
    }
  }
  dijkstra(S);
  REP(i, N - 1) {
    int ans = INF;
    REP(j, 2501) { ans = min(ans, d[i + 1][j]); }
    cout << ans << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define REP(i, n) for (int i = 0; i < n; i++)
#define ALL(a) (a).begin(), (a).end()
typedef vector<int> vi;
const int INF = 1LL << 60; // 10e18+10e17ちょっとくらい
const int MOD = 1000000007;
const int MAX_N = 200100;

struct edge {
  int to_node_idx;
  int to_money_idx;
  int cost;
};

// <コスト, 頂点の番号, 残高>
using P = pair<int, pair<int, int>>;

int N;                    // ノード数
vector<edge> G[51][2510]; // グラフ 都市番号と残高
int d[51][2510];          // 最小コストを保存する配列

void dijkstra(int s) {
  priority_queue<P, vector<P>, greater<P>> que; // vector<P>の形でコスト昇順
  REP(i, N)                                     // コストをINFで初期化
  {
    REP(j, 2510) { d[i][j] = INF; }
  }
  d[0][s] = 0;                             // 初期値へのコストは0
  que.push(make_pair(0, make_pair(0, s))); // 初期値<コスト、頂点番号>

  while (!que.empty()) {
    P p = que.top();
    que.pop();
    int node = p.second.first;
    int money = p.second.second;
    if (d[node][money] < p.first)
      continue;

    for (int i = 0; i < (int)G[node][money].size(); ++i) // vからいけるところ
    {
      edge e = G[node][money][i];
      if (d[e.to_node_idx][e.to_money_idx] >
          d[node][money] + e.cost) // コストが更新できればqueueに追加
      {
        d[e.to_node_idx][e.to_money_idx] = d[node][money] + e.cost;
        que.push(make_pair(d[e.to_node_idx][e.to_money_idx],
                           make_pair(e.to_node_idx, e.to_money_idx)));
      }
    }
  }
}

signed main() {
  //  以降 cin の入力元が 'input.txt' になる
  // std::ifstream in("input.txt");
  // std::cin.rdbuf(in.rdbuf());
  int M, S;
  cin >> N >> M >> S;
  REP(i, M) {
    int u, v, a, b;
    cin >> u >> v >> a >> b;
    u--;
    v--;
    REP(money, 2501) {
      if (money >= a) // 残高があれば移動できる
      {
        edge e = {v, money - a, b};
        G[u][money].push_back(e);
      }
    }
    REP(money, 2501) {
      if (money >= a) // 残高があれば移動できる
      {
        edge e = {u, money - a, b};
        G[v][money].push_back(e);
      }
    }
  }
  REP(i, N) {
    int c, d;
    cin >> c >> d;
    REP(money, 2501) {
      edge e = {i, min(2500LL, money + c), d};
      G[i][money].push_back(e);
    }
  }
  dijkstra(S);
  REP(i, N - 1) {
    int ans = INF;
    REP(j, 2501) { ans = min(ans, d[i + 1][j]); }
    cout << ans << endl;
  }
  return 0;
}