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

#include <bits/stdc++.h>
using namespace std;
#define INF 1e9

// adjlist[A].first ===== コスト！

vector<int> dijk(int s, int v, vector<vector<pair<int, int>>> adjlist) {

  priority_queue<pair<int, int>> wait;
  vector<int> result(v, INF);

  // スタート地点を追加
  result[s] = 0;
  wait.push(make_pair(0, s));

  // ダイクストラ本体
  while (!wait.empty()) { // waitが空になるまで

    int nowpoint = wait.top().second;
    int nowcost = -wait.top().first;
    wait.pop();

    if (result[nowpoint] < nowcost)
      continue;

    // 今いる頂点と隣接しているすべての頂点をなめる
    for (int i = 0; i < adjlist[nowpoint].size(); i++) {

      int nextpoint = adjlist[nowpoint][i].second;
      int nextcost = nowcost + adjlist[nowpoint][i].first;
      // 現時点より安く到達できそうであれば、結果を更新して優先度付きキューに格納
      if (result[nextpoint] > nextcost) {
        result[nextpoint] = nextcost;
        wait.push(make_pair(-nextcost, nextpoint));
      }
    }
  }

  return result; // 結果列を返す
}

int main() {

  while (1) {
    int n, m, l;
    cin >> n >> m >> l;
    if (!n)
      break;
    vector<vector<pair<int, int>>> adjlist(100001);

    for (int i = 0; i < m; i++) {
      int a, b, d, e;
      cin >> a >> b >> d >> e;
      a--;
      b--;
      // 護衛を雇わないとき
      for (int j = 0; j <= l; j++) {
        int A = a + j * 100;
        int B = b + j * 100;
        adjlist[A].push_back({e, B});
        adjlist[B].push_back({e, A});
        // cout << A << " " << B << " " << e << endl;
      }

      // 護衛を雇うとき
      for (int j = l; j - d >= 0; j--) {
        int A = a + j * 100;
        int B = b + (j - d) * 100;
        adjlist[A].push_back({0, B});
        // cout << A << " " << B << " " << 0 << endl;
        A = b + j * 100;
        B = a + (j - d) * 100;
        adjlist[A].push_back({0, B});
        // cout << A << " " << B << " " << 0 << endl;
      }
    }

    vector<int> result(100001);
    result = dijk(100 * l, 100001, adjlist);
    // cout << result[G] << endl;

    /*for(int i = 0; i < 10001; i++){
        cout << i << ": " << result[i] << endl;
    }*/
    int ans = INF;
    for (int i = 0; i <= l; i++) {
      // cout << n - 1 + 100 * i << " " << result[n - 1 + 100 * i] << endl;
      ans = min(ans, result[n - 1 + i * 100]);
    }
    cout << ans << endl;
  }
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define INF 1e9

// adjlist[A].first ===== コスト！

vector<int> dijk(int s, int v, vector<vector<pair<int, int>>> adjlist) {

  priority_queue<pair<int, int>> wait;
  vector<int> result(v, INF);

  // スタート地点を追加
  result[s] = 0;
  wait.push(make_pair(0, s));

  // ダイクストラ本体
  while (!wait.empty()) { // waitが空になるまで

    int nowpoint = wait.top().second;
    int nowcost = -wait.top().first;
    wait.pop();

    if (result[nowpoint] < nowcost)
      continue;

    // 今いる頂点と隣接しているすべての頂点をなめる
    for (int i = 0; i < adjlist[nowpoint].size(); i++) {

      int nextpoint = adjlist[nowpoint][i].second;
      int nextcost = nowcost + adjlist[nowpoint][i].first;
      // 現時点より安く到達できそうであれば、結果を更新して優先度付きキューに格納
      if (result[nextpoint] > nextcost) {
        result[nextpoint] = nextcost;
        wait.push(make_pair(-nextcost, nextpoint));
      }
    }
  }

  return result; // 結果列を返す
}

int main() {

  while (1) {
    int n, m, l;
    cin >> n >> m >> l;
    if (!n)
      break;
    vector<vector<pair<int, int>>> adjlist(10001);

    for (int i = 0; i < m; i++) {
      int a, b, d, e;
      cin >> a >> b >> d >> e;
      a--;
      b--;
      // 護衛を雇わないとき
      for (int j = 0; j <= l; j++) {
        int A = a + j * 100;
        int B = b + j * 100;
        adjlist[A].push_back({e, B});
        adjlist[B].push_back({e, A});
        // cout << A << " " << B << " " << e << endl;
      }

      // 護衛を雇うとき
      for (int j = l; j - d >= 0; j--) {
        int A = a + j * 100;
        int B = b + (j - d) * 100;
        adjlist[A].push_back({0, B});
        // cout << A << " " << B << " " << 0 << endl;
        A = b + j * 100;
        B = a + (j - d) * 100;
        adjlist[A].push_back({0, B});
        // cout << A << " " << B << " " << 0 << endl;
      }
    }

    vector<int> result(10001);
    result = dijk(100 * l, 10001, adjlist);
    // cout << result[G] << endl;

    /*for(int i = 0; i < 10001; i++){
        cout << i << ": " << result[i] << endl;
    }*/
    int ans = INF;
    for (int i = 0; i <= l; i++) {
      // cout << n - 1 + 100 * i << " " << result[n - 1 + 100 * i] << endl;
      ans = min(ans, result[n - 1 + i * 100]);
    }
    cout << ans << endl;
  }
  return 0;
}