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

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

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 dfs(set<int> &S, int now, vector<int> &go, vector<int> &x) {

  if (go[now] != -1)
    return go[now];
  else if (S.find(now) != S.end()) {
    go[now] = -2;
    return -2;
  } else if (x[now] == 0)
    return now;
  else {
    S.insert(now);
    go[now] = dfs(S, now + x[now], go, x);
    return go[now];
  }
}

int main() {

  int n;
  cin >> n;
  vector<int> x(n);
  for (int i = 0; i < n; i++)
    cin >> x[i];
  vector<int> go(n, -1);
  for (int i = 0; i < n; i++) {
    set<int> S;
    S.insert(i);
    if (x[i] != 0 && go[i] == -1)
      go[i] = dfs(S, i + x[i], go, x);
  }

  // for(int i = 0; i < n; i++) cout << go[i] << " ";
  vector<vector<pair<int, int>>> adjlist(n); // first := コスト　second := 行先

  // 入力
  for (int i = 0; i < n; i++) {
    if (x[i] == 0)
      for (int j = 1; j <= 6 && i + j < n; j++) {
        if (go[i + j] == -1)
          adjlist[i].push_back(make_pair(1, i + j));
        else if (go[i + j] != -2)
          adjlist[i].push_back(make_pair(1, go[i + j]));
      }
  }

  vector<int> result(n);
  result = dijk(0, n, adjlist);
  // cout << result[G] << endl;

  /*for(int i = 0; i < n; i++){
      cout << i << ": " << result[i] << endl;
  }*/

  cout << result[n - 1] << endl;
  return 0;
}


Error: 0

Fixed submission:

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

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 dfs(int s, int now, vector<int> &go, vector<int> &x) {

  if (go[now] != -1)
    return go[now];
  else if (s == now)
    return -2;
  else if (x[now] == 0)
    return now;
  else {
    go[now] = dfs(s, now + x[now], go, x);
    return go[now];
  }
}

int main() {

  int n;
  cin >> n;
  vector<int> x(n);
  for (int i = 0; i < n; i++)
    cin >> x[i];
  vector<int> go(n, -1);
  for (int i = 0; i < n; i++) {
    if (x[i] != 0 && go[i] == -1)
      go[i] = dfs(i, i + x[i], go, x);
  }

  // for(int i = 0; i < n; i++) cout << go[i] << " ";
  vector<vector<pair<int, int>>> adjlist(n); // first := コスト　second := 行先

  // 入力
  for (int i = 0; i < n; i++) {
    if (x[i] == 0)
      for (int j = 1; j <= 6 && i + j < n; j++) {
        if (go[i + j] == -1)
          adjlist[i].push_back(make_pair(1, i + j));
        else if (go[i + j] != -2)
          adjlist[i].push_back(make_pair(1, go[i + j]));
      }
  }

  vector<int> result(n);
  result = dijk(0, n, adjlist);
  // cout << result[G] << endl;

  /*for(int i = 0; i < n; i++){
      cout << i << ": " << result[i] << endl;
  }*/

  cout << result[n - 1] << endl;
  return 0;
}