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

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

const int INF = 10000000;

void print(vector<int> x) {
  for (int n = 0; n < x.size(); n++) {
    cout << x[n] << " ";
  }
  cout << endl;
}

int main() {

  // 部屋をnとしたらto_room[n]から接続している先の部屋のベクタ
  vector<int> to_room[100010];

  int N, M;
  cin >> N >> M;

  for (int n = 1; n <= M; n++) {
    int a, b;
    cin >> a >> b;
    to_room[a].push_back(b);
    to_room[b].push_back(a);
  }

  // 部屋をnとしたらcost[n]は部屋1に至るまでの距離
  // まだ距離を計算できていない場合は最大値(INF)である
  vector<int> cost(N + 1, INF);

  // 部屋1から通ってきた部屋の記録
  // 制約に"どの2部屋間も、通路をいくつか通って行き来できる"とあるので、
  // 必ずすべての部屋へ到達できる
  vector<int> route(N + 1, -1);

  // 部屋1の評価値の初期化
  cost[1] = 0;

  // 探索する部屋
  queue<int> q;
  q.push(1);

  while (!q.empty()) {
    int n = q.front(); // 探索元の部屋番号
    q.pop();
    for (int m : to_room[n]) { // m: 接続先の部屋番号
      if (cost[m] != INF) { // costが更新されていたら評価は行わない
        continue;
      }
      cost[m] = cost[n] + 1;
      route[m] = n; // 部屋mは部屋nを経由する
      q.push(m);
    }
  }
  // cout << "cost" << endl;
  // print(cost);

  // 全ての部屋のコストが-1でないならyesを出力する
  // 実は答えは必ずyesである。
  bool check = true;
  for (int n = 2; n <= N; n++) {
    if (cost[n] == INF) {
      check = false;
    }
  }

  if (check == true) {
    cout << "Yes" << endl;
    for (int n = 2; n <= N; n++) {
      cout << route[n] << endl;
    }
  } else {
    cout << "No" << endl;
  }
}


Error: 0

Fixed submission:

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

// 部屋roomから連結先の部屋
struct room_conn_t {
  int room;
  set<int> to_room;
};

using rtor_t = vector<room_conn_t>;

// ある部屋から連結している部屋のIDと部屋1に至るまでのコスト
struct room_cost_t {
  int shirube;
  int cost;
};

using cost_t = vector<room_cost_t>;

void print(rtor_t x) {
  for (int n = 0; n < x.size(); n++) {
    cout << x[n].room;
    for (auto v : x[n].to_room) {
      cout << " " << v;
    }
    cout << endl;
  }
}

void print(cost_t x) {
  for (int n = 0; n < x.size(); n++) {
    cout << x[n].shirube << " " << x[n].cost << endl;
  }
}

int main() {
  int N, M;
  cin >> N >> M;

  // 部屋間のリンク
  rtor_t rtor(M + 1);
  for (int n = 1; n <= M; n++) {
    int a, b;
    cin >> a >> b;
    rtor[a].room = a;
    rtor[b].room = b;
    rtor[a].to_room.insert(b); // 部屋aから部屋bへのリンク
    rtor[b].to_room.insert(a); // 部屋bから部屋aへのリンク
  }

  cost_t cost(N + 1);
  // 評価値の初期化
  for (int n = 0; n <= N; n++) {
    cost[n].shirube = -1;
    cost[n].cost = -1;
  }

  // 部屋1の評価値の初期化
  cost[1].shirube = 1; // 道しるべは自分自身にする
  cost[1].cost = 0;

  bool update = true;
  while (update) {
    update = false;
    for (int n = 1; n <= N; n++) {
      for (int m = 1; m <= N; m++) {
        if (n == m) {
          continue;
        }
        // 部屋nから部屋mへのリンクがあるなら道しるべとコストを更新する
        if (rtor[n].to_room.count(m)) {
          // cout << "hit0" << endl;
          // 部屋nに道しるべがあり部屋mにないなら部屋mの道しるべを部屋nにする
          if (cost[n].shirube != -1 && cost[m].shirube == -1) {
            // cout << "hit1" << endl;
            cost[m].shirube = n;
            update = true;
          }
          // 部屋mのコストを計算する
          int m_cost = (cost[n].cost != -1 ? m_cost = cost[n].cost + 1 : -1);

          // 部屋1のコストは更新しない
          // m_costが-1なら更新しない
          // 部屋mのコストが-1なら更新する
          // 部屋mのコストがm_costより大きいなら更新する
          if ((m != 1) && (m_cost != -1) &&
              ((cost[m].cost == -1) || cost[m].cost > m_cost)) {
            // cout << "hit2" << endl;
            cost[m].cost = m_cost;
            update = true;
          }
        }
      }
    }
    // cout << "cost" << endl;
    // print(cost);
  }

  // cout << "rtor" << endl;
  // print(rtor);
  // cout << "cost" << endl;
  // print(cost);

  // 全ての部屋のコストが-1でないならyesを出力する
  bool check = true;
  for (int n = 2; n <= N; n++) {
    if (cost[n].cost == -1) {
      check = false;
    }
  }
  if (check == true) {
    cout << "Yes" << endl;
    for (int n = 2; n <= N; n++) {
      cout << cost[n].shirube << endl;
    }
  } else {
    cout << "No" << endl;
  }
}