Problem p03911 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = n - 1; i >= 0; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
typedef pair<ll, ll> P;
typedef pair<ll, ll> Pll;
// 小数点以下　cout << fixed << setprecision(10) << num << endl;
// 桁数はlog10(mid)でやれ　log(mid)/log(10)はWA
// long*long<0で判定するな
// 開区間と閉区間
// アルファベットが何番目かは x=s[i]-'a'
// bfsはmain()内で　rep(i,h)rep(j,w)rep(i,4)でバグ
// 切り上げ：(a+(b-1))/b
// 32bit以上は 1ull<<j
//  map 初期値0 for(auto itr=mp.begin();itr!=mp.end();++itr) itr->fi itr->se
//  で全探索 for(auto u:mp) u.fi u.se も可能
// n個のgcd,lcmは一つずつみて更新していく
// 大きな数を扱うときは素因数分解した形で持っておく
//  (l/a[i]) = l*powmod(a[i],MOD-2)%MOD;
// auto itr=lower_bound(ALL(a),key) a[itr-a.begin()]

int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> to(n + m);
  rep(i, n) {
    int k;
    cin >> k;
    k--;
    rep(j, k) {
      int l;
      cin >> l;
      l--;
      to[i].pb(n + l);
      to[n + l].pb(i);
    }
  }
  vector<bool> visit(n + m, 0);
  queue<int> q;
  visit[0] = 1;
  q.push(0);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (auto u : to[v]) {
      if (!visit[u]) {
        visit[u] = 1;
        q.push(u);
      }
    }
  }
  bool ans = 1;
  rep(i, n) {
    if (!visit[i])
      ans = 0;
  }
  if (ans)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>
#define ll long long
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = n - 1; i >= 0; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
typedef pair<ll, ll> P;
typedef pair<ll, ll> Pll;
// 小数点以下　cout << fixed << setprecision(10) << num << endl;
// 桁数はlog10(mid)でやれ　log(mid)/log(10)はWA
// long*long<0で判定するな
// 開区間と閉区間
// アルファベットが何番目かは x=s[i]-'a'
// bfsはmain()内で　rep(i,h)rep(j,w)rep(i,4)でバグ
// 切り上げ：(a+(b-1))/b
// 32bit以上は 1ull<<j
//  map 初期値0 for(auto itr=mp.begin();itr!=mp.end();++itr) itr->fi itr->se
//  で全探索 for(auto u:mp) u.fi u.se も可能
// n個のgcd,lcmは一つずつみて更新していく
// 大きな数を扱うときは素因数分解した形で持っておく
//  (l/a[i]) = l*powmod(a[i],MOD-2)%MOD;
// auto itr=lower_bound(ALL(a),key) a[itr-a.begin()]

int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> to(n + m);
  rep(i, n) {
    int k;
    cin >> k;
    rep(j, k) {
      int l;
      cin >> l;
      l--;
      to[i].pb(n + l);
      to[n + l].pb(i);
    }
  }
  vector<bool> visit(n + m, 0);
  queue<int> q;
  visit[0] = 1;
  q.push(0);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (auto u : to[v]) {
      if (!visit[u]) {
        visit[u] = 1;
        q.push(u);
      }
    }
  }
  bool ans = 1;
  rep(i, n) {
    if (!visit[i])
      ans = 0;
  }
  if (ans)
    cout << "YES" << endl;
  else
    cout << "NO" << endl;
}