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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
typedef pair<ll, ll> P;

const ll INF = 100100100100100100;
const ll MAX_V = 100000;
const ll MAX_E = 200000;

struct edge {
  // Dijkstraでは隣接リストを用いるのでfromはいらない
  // int from;
  ll to;
  ll c;
};

// 　最短路の直前の頂点を保管しておく.初期化は-1でしておき，-1となっている頂点はそこから出発したことを意味する．
vector<ll> prev_path(1000000, -1);

void dijkstra(const ll &s, const ll &V, const ll &E,
              const vector<vector<edge>> &ed, vector<ll> &d) {

  // s:start, V:頂点数，E:辺の数, ed:辺の情報, d:距離
  // 今回は参照でdを更新しているが全ての頂点からの最短経路が必要になれば修正する

  // 初期設定
  // queのPは<最短経路，頂点番号>
  priority_queue<P, vector<P>, greater<P>> que;
  rep(i, V) d[i] = INF;
  d[s] = 0;
  que.push(P(0, s));

  while (!que.empty()) {
    P p = que.top();
    // cout << p.second << endl;
    que.pop();
    ll v = p.second;
    if (d[v] < p.first)
      continue; // もっと良い方法で更新されてたのでこのキューは捨てる
    vector<edge> e = ed[v];
    // cout << e.size() << endl;
    for (ll i = 0; i < e.size(); i++) {
      if (d[e[i].to] > d[v] + e[i].c) {
        d[e[i].to] = d[v] + e[i].c;
        que.push(P(d[e[i].to], e[i].to));
        prev_path[e[i].to] = v;
      }
    }
  }
  return;
}

// 経路を求めるための関数
vector<ll> get_path(ll t) {
  // sからtまでの経路を求める．
  // vector<ll> prev
  // はsからのダイクストラをしたときに保存されたことを前提としている．

  vector<ll> path;
  for (; t != -1; t = prev_path[t]) {
    path.push_back(t);
  }
  reverse(path.begin(), path.end());
  cout << "get path" << endl;
  return path;
}

int main() {
  ll V, k;
  cin >> V >> k;

  vector<vector<edge>> ed(V);
  vector<ll> d(V);
  rep(i, k) {
    ll from, to;
    cin >> from >> to;
    from--;
    to--;
    edge e;
    e.to = to;
    e.c = 1;
    ed[from].push_back(e);
    edge re;
    re.to = from;
    re.c = 1;
    ed[to].push_back(re);
  }
  dijkstra(0, V, k, ed, d);
  // rep(i,V)cout << d[i] << endl;

  // 以下経路を求めるための関数
  // vector<ll> path = get_path(V-1);
  // rep(i,path.size()){
  //     cout << path[i] << "->";
  // }
  // cout << endl;
  // rep(i,V){
  //   cout << prev_path[i] <<endl;
  // }

  rep(i, V - 1) {
    if (prev_path[i + 1] == -1) {
      cout << i + 1 << endl;
      cout << "No" << endl;
      return 0;
    }
  }
  cout << "Yes" << endl;
  rep(i, V - 1) { cout << prev_path[i + 1] + 1 << endl; }

  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
typedef pair<ll, ll> P;

const ll INF = 100100100100100100;
const ll MAX_V = 1000;
const ll MAX_E = 1000;

struct edge {
  // Dijkstraでは隣接リストを用いるのでfromはいらない
  // int from;
  ll to;
  ll c;
};

// 　最短路の直前の頂点を保管しておく.初期化は-1でしておき，-1となっている頂点はそこから出発したことを意味する．
vector<ll> prev_path(MAX_V, -1);

void dijkstra(const ll &s, const ll &V, const ll &E,
              const vector<vector<edge>> &ed, vector<ll> &d) {

  // s:start, V:頂点数，E:辺の数, ed:辺の情報, d:距離
  // 今回は参照でdを更新しているが全ての頂点からの最短経路が必要になれば修正する

  // 初期設定
  // queのPは<最短経路，頂点番号>
  priority_queue<P, vector<P>, greater<P>> que;
  rep(i, V) d[i] = INF;
  d[s] = 0;
  que.push(P(0, s));

  while (!que.empty()) {
    P p = que.top();
    // cout << p.second << endl;
    que.pop();
    ll v = p.second;
    if (d[v] < p.first)
      continue; // もっと良い方法で更新されてたのでこのキューは捨てる
    vector<edge> e = ed[v];
    // cout << e.size() << endl;
    for (ll i = 0; i < e.size(); i++) {
      if (d[e[i].to] > d[v] + e[i].c) {
        d[e[i].to] = d[v] + e[i].c;
        que.push(P(d[e[i].to], e[i].to));
        prev_path[e[i].to] = v;
      }
    }
  }
  return;
}

// 経路を求めるための関数
vector<ll> get_path(ll t) {
  // sからtまでの経路を求める．
  // vector<ll> prev
  // はsからのダイクストラをしたときに保存されたことを前提としている．

  vector<ll> path;
  for (; t != -1; t = prev_path[t]) {
    path.push_back(t);
  }
  reverse(path.begin(), path.end());
  cout << "get path" << endl;
  return path;
}

int main() {
  ll V, k;
  cin >> V >> k;

  vector<vector<edge>> ed(V);
  vector<ll> d(V);
  rep(i, k) {
    ll from, to;
    cin >> from >> to;
    from--;
    to--;
    edge e;
    e.to = to;
    e.c = 1;
    ed[from].push_back(e);
    edge re;
    re.to = from;
    re.c = 1;
    ed[to].push_back(re);
  }
  dijkstra(0, V, k, ed, d);
  // rep(i,V)cout << d[i] << endl;

  // 以下経路を求めるための関数
  // vector<ll> path = get_path(V-1);
  // rep(i,path.size()){
  //     cout << path[i] << "->";
  // }
  // cout << endl;
  // rep(i,V){
  //   cout << prev_path[i] <<endl;
  // }

  rep(i, V - 1) {
    if (prev_path[i + 1] == -1) {
      cout << i + 1 << endl;
      cout << "No" << endl;
      return 0;
    }
  }
  cout << "Yes" << endl;
  rep(i, V - 1) { cout << prev_path[i + 1] + 1 << endl; }

  return 0;
}