Problem p02678 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>

using namespace std;

typedef long long ll;
// constexpr ll MOD = 998244353;
constexpr ll MOD = 1000000007;

// struct UnionFind {
//     vector<ll> par;
//     vector<ll> siz;

//     UnionFind(ll N): par(N), siz(N,1) {
//         for (ll i=0;i<N;i++) par[i] = i;
//     }

//     ll root(ll x) {
//         if (par[x] == x) return x;
//         else return par[x] = root(par[x]);
//     }

//     void unite(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         if (rx == ry) return;
//         // if (siz[rx] < siz[ry]) swap(rx,ry);
//         par[rx] = ry;
//         siz[ry] += siz[rx];
//     }

//     bool same(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         return rx == ry;
//     }

//     ll size(ll x) {
//         return siz[root(x)];
//     }
// };

//     vector<ll> par;
//     vector<ll> siz;

//     UnionFind(ll N): par(N), siz(N,1LL) {
//         for (ll i=0;i<N;i++) par[i] = i;
//     }

//     ll root(ll x) {
//         if (par[x] == x) return x;
//         else return par[x] = root(par[x]);
//     }

//     void unite(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         if (rx == ry) return;
//         par[rx] = ry;
//         siz[ry] += siz[rx];
//     }

//     bool same(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         return rx == ry;
//     }

//     ll size(ll x) {
//         return siz[root(x)];
//     }
// };

int main(void) {
  int N, M;
  vector<int> A(100010), B(100010);
  vector<set<int>> S(100010);
  cin >> N >> M;
  for (int i = 0; i < M; i++)
    cin >> A[i] >> B[i];
  for (int i = 0; i < M; i++) {
    S[A[i]].insert(B[i]);
    S[B[i]].insert(A[i]);
  }

  queue<int> Q;
  vector<bool> C(100010, false);
  vector<int> G(100010, 0);
  Q.push(1);
  C[1] = true;
  bool flag = false;
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    for (auto itr : S[x]) {
      if (!C[itr]) {
        C[itr] = true;
        Q.push(itr);
      }
      if (!G[itr])
        G[itr] = x;
    }
  }
  cout << "Yes" << endl;
  for (int i = 2; i <= N; i++) {
    cout << G[i] << endl;
  }

  return 0;
}


Fixed submission:
#include <algorithm>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>

using namespace std;

typedef long long ll;
// constexpr ll MOD = 998244353;
constexpr ll MOD = 1000000007;

// struct UnionFind {
//     vector<ll> par;
//     vector<ll> siz;

//     UnionFind(ll N): par(N), siz(N,1) {
//         for (ll i=0;i<N;i++) par[i] = i;
//     }

//     ll root(ll x) {
//         if (par[x] == x) return x;
//         else return par[x] = root(par[x]);
//     }

//     void unite(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         if (rx == ry) return;
//         // if (siz[rx] < siz[ry]) swap(rx,ry);
//         par[rx] = ry;
//         siz[ry] += siz[rx];
//     }

//     bool same(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         return rx == ry;
//     }

//     ll size(ll x) {
//         return siz[root(x)];
//     }
// };

//     vector<ll> par;
//     vector<ll> siz;

//     UnionFind(ll N): par(N), siz(N,1LL) {
//         for (ll i=0;i<N;i++) par[i] = i;
//     }

//     ll root(ll x) {
//         if (par[x] == x) return x;
//         else return par[x] = root(par[x]);
//     }

//     void unite(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         if (rx == ry) return;
//         par[rx] = ry;
//         siz[ry] += siz[rx];
//     }

//     bool same(ll x, ll y) {
//         ll rx = root(x);
//         ll ry = root(y);
//         return rx == ry;
//     }

//     ll size(ll x) {
//         return siz[root(x)];
//     }
// };

int main(void) {
  int N, M;
  vector<int> A(200010), B(200010);
  vector<set<int>> S(100010);
  cin >> N >> M;
  for (int i = 0; i < M; i++)
    cin >> A[i] >> B[i];
  for (int i = 0; i < M; i++) {
    S[A[i]].insert(B[i]);
    S[B[i]].insert(A[i]);
  }

  queue<int> Q;
  vector<bool> C(100010, false);
  vector<int> G(100010, 0);
  Q.push(1);
  C[1] = true;
  bool flag = false;
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    for (auto itr : S[x]) {
      if (!C[itr]) {
        C[itr] = true;
        Q.push(itr);
      }
      if (!G[itr])
        G[itr] = x;
    }
  }
  cout << "Yes" << endl;
  for (int i = 2; i <= N; i++) {
    cout << G[i] << endl;
  }

  return 0;
}