Problem p02902 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

struct Edge {
  int to;
};
using Graph = vector<vector<Edge>>;

const int INF = 1e8;
// 幅優先探索
vector<int> dist; // 始点からの距離を記録
vector<int> pre;
void bfs(const Graph &G, int s) {
  dist.assign((int)G.size(), INF); // 初期化
  pre.assign((int)G.size(), -1);
  queue<int> que;
  que.emplace(s); // sから探索する
  dist[s] = 0;
  while (que.size() != 0) { // 幅優先探索
    int now = que.front();  // 現在の状態
    que.pop();
    for (auto e : G[now]) {
      if (dist[e.to] == INF) { // 未探索の時のみ行う
        dist[e.to] = dist[now] + 1;
        pre[e.to] = now;
        que.emplace(e.to);
      }
    }
  }
}
/* get_path(prev, t)
    入力：dijkstra で得た prev, ゴール t
    出力： t への最短路のパス
*/
vector<int> get_path(const vector<int> &prev, int t) {
  vector<int> path;
  for (int cur = t; cur != -1; cur = prev[cur]) {
    path.push_back(cur);
  }
  reverse(path.begin(), path.end());
  return path;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

int main() {
  // cin.tie(0);
  // ios::sync_with_stdio(false);

  int V, E;
  cin >> V >> E;

  Graph G(V);
  for (int i = 0; i < E; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    G[a].push_back({b});
    // G[b].push_back({a});
  }

  int ans = INF;
  int ans_v = 0;
  int ans_i = 0;
  for (int v = 0; v < V; v++) {
    for (int i = 0; i < (int)G[v].size(); i++) {
      // cout << "ans: " << ans << endl;
      Edge e = G[v][i];
      G[v].erase(G[v].begin() + i);
      bfs(G, e.to);
      if (chmin(ans, dist[v] + 1)) {
        ans_v = v;
        ans_i = i;
      }
      G[v].insert((G[v].begin() + i), e);
    }
  }

  Edge e = G[ans_v][ans_i];
  G[ans_v].erase(G[ans_v].begin() + ans_i);
  bfs(G, e.to);
  if (dist[ans_v] == INF) {
    cout << -1 << endl;
    return 0;
  }
  cout << dist[ans_v] + 1 << "\n";
  for (auto i : get_path(pre, ans_v)) {
    cout << i + 1 << "\n";
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

struct Edge {
  int to;
};
using Graph = vector<vector<Edge>>;

const int INF = 1e8;
// 幅優先探索
vector<int> dist; // 始点からの距離を記録
vector<int> pre;
void bfs(const Graph &G, int s) {
  dist.assign((int)G.size(), INF); // 初期化
  pre.assign((int)G.size(), -1);
  queue<int> que;
  que.emplace(s); // sから探索する
  dist[s] = 0;
  while (que.size() != 0) { // 幅優先探索
    int now = que.front();  // 現在の状態
    que.pop();
    for (auto e : G[now]) {
      if (dist[e.to] == INF) { // 未探索の時のみ行う
        dist[e.to] = dist[now] + 1;
        pre[e.to] = now;
        que.emplace(e.to);
      }
    }
  }
}
/* get_path(prev, t)
    入力：dijkstra で得た prev, ゴール t
    出力： t への最短路のパス
*/
vector<int> get_path(const vector<int> &prev, int t) {
  vector<int> path;
  for (int cur = t; cur != -1; cur = prev[cur]) {
    path.push_back(cur);
  }
  reverse(path.begin(), path.end());
  return path;
}

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

int main() {
  // cin.tie(0);
  // ios::sync_with_stdio(false);

  int V, E;
  cin >> V >> E;

  Graph G(V);
  for (int i = 0; i < E; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    G[a].push_back({b});
    // G[b].push_back({a});
  }

  if (E == 0) {
    cout << -1 << endl;
    return 0;
  }
  int ans = INF;
  int ans_v = 0;
  int ans_i = 0;
  for (int v = 0; v < V; v++) {
    for (int i = 0; i < (int)G[v].size(); i++) {
      // cout << "ans: " << ans << endl;
      Edge e = G[v][i];
      G[v].erase(G[v].begin() + i);
      bfs(G, e.to);
      if (chmin(ans, dist[v] + 1)) {
        ans_v = v;
        ans_i = i;
      }
      G[v].insert((G[v].begin() + i), e);
    }
  }

  Edge e = G[ans_v][ans_i];
  G[ans_v].erase(G[ans_v].begin() + ans_i);
  bfs(G, e.to);
  if (dist[ans_v] == INF) {
    cout << -1 << endl;
    return 0;
  }
  cout << dist[ans_v] + 1 << "\n";
  for (auto i : get_path(pre, ans_v)) {
    cout << i + 1 << "\n";
  }
  return 0;
}