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

#include <bits/stdc++.h>

#define ALL(l) (l).begin(), (l).end()
#define rep(i, n) for (ll(i) = 0; (i) < (n); (i)++)
using namespace std;
typedef long long ll;
// const ll mod =  1000000007;
// const ll maxn = 1000000000;

//---------------------------------------------------------------------------------------------------
using vi = vector<int>; // intの1次元の型に vi という別名をつける
using vll = vector<ll>; // intの1次元の型に vi という別名をつける
using vvll = vector<vll>; // intの2次元の型に vvi という別名をつける
using vs = vector<string>; // stringの1次元の型に vs という別名をつける
using pll =
    pair<ll, ll>; // これ以降 pii という型名はpair<ll, ll> と同じ意味で使える
//---------------------------------------------------------------------------------------------------

int main() {

  queue<int> q;

  int v, e;
  cin >> v >> e;

  vector<int> g[v + 1];
  // ans(i):部屋iの道しるべ
  vector<int> ans(v + 1, -1);

  ans[1] = 1;
  // 1番目の部屋は必ず１の部屋に行ける

  for (int i = 0; i < e; i++) {
    int s, t;
    cin >> s >> t;
    g[s].push_back(t);
    g[t].push_back(s);
  } // とりあえず、辺の情報を隣接リストに収納

  for (int u : g[1]) {
    if (u == 0)
      break;
    else {
      q.push(u);
      ans[u] = 1; // 部屋sと接している部屋の道しるべは1
    }
  } // まず、1の部屋から調べて行って、1の部屋と直接つながっているときに道しるべは必ず１

  while (!q.empty()) {

    // 全ての部屋に道しるべができるまで調べる。BFS?

    int s = q.front();
    q.pop(); // すでに道しるべが決まっている部屋sを１つずつ調べる。

    for (int u : g[s]) {

      if (ans[u] != -1)
        continue; // すでに道しるべあり
      else {
        q.push(u);
        ans[u] =
            s; // 部屋sと接しているかつ、まだ道しるべがないところは道しるべがsになる。
      }
    }
  }
  // 全ての部屋はつながっているので必ず道しるべがある
  cout << "Yes" << endl;
  for (int i = 2; i < v + 1; i++) {
    cout << ans[i] << endl;
  }

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>

#define ALL(l) (l).begin(), (l).end()
#define rep(i, n) for (ll(i) = 0; (i) < (n); (i)++)
using namespace std;
typedef long long ll;
// const ll mod =  1000000007;
// const ll maxn = 1000000000;

//---------------------------------------------------------------------------------------------------
using vi = vector<int>; // intの1次元の型に vi という別名をつける
using vll = vector<ll>; // intの1次元の型に vi という別名をつける
using vvll = vector<vll>; // intの2次元の型に vvi という別名をつける
using vs = vector<string>; // stringの1次元の型に vs という別名をつける
using pll =
    pair<ll, ll>; // これ以降 pii という型名はpair<ll, ll> と同じ意味で使える
//---------------------------------------------------------------------------------------------------

int main() {

  queue<int> q;

  int v, e;
  cin >> v >> e;

  vector<int> g[v + 1];
  // ans(i):部屋iの道しるべ
  vector<int> ans(v + 1, -1);
  // for(int i=2;i<v+1;i++)ans[i]=0;
  ans[1] = 1;
  // 1番目の部屋は必ず１の部屋に行ける

  for (int i = 0; i < e; i++) {
    int s, t;
    cin >> s >> t;
    g[s].push_back(t);
    g[t].push_back(s);
  } // とりあえず、辺の情報を隣接リストに収納

  for (int i = 0; i < v + 1; i++) {
    // cout<<g[1][i]<<endl;
    int u = g[1][i];
    if (u == 0)
      break;
    else {
      q.push(u);
      ans[u] = 1; // 部屋sと接している部屋の道しるべは1
    }
  } // まず、1の部屋から調べて行って、1の部屋と直接つながっているときに道しるべは必ず１

  while (!q.empty()) {
    // rep(k,e){
    // 全ての部屋に道しるべができるまで調べる。BFS?

    int s = q.front();
    q.pop(); // すでに道しるべが決まっている部屋sを１つずつ調べる。

    for (int u : g[s]) {
      // int u=g[s][i];//uはsと接している部屋;
      // if(u==0)break;
      // else {
      if (ans[u] != -1)
        ; // continue;//すでに道しるべあり
      else {
        q.push(u);
        ans[u] =
            s; // 部屋sと接しているかつ、まだ道しるべがないところは道しるべがsになる。
      }
      //}
    }
  }
  // 全ての部屋はつながっているので必ず道しるべがある
  cout << "Yes" << endl;
  for (int i = 2; i < v + 1; i++) {
    cout << ans[i] << endl;
  }

  return 0;
}