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

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------
vector<int> G[2000];

int sumi[50][2000];

void ch(int root, int p) {

  //	if(G[p].size()==0) return;
  //	if(root==1) cout<<"root "<<sumi[root][p]<<endl;
  if (sumi[root][p] == 1)
    return;
  //	cout<<root<<" "<<p<<" "<<sumi[1][1]<<endl;
  sumi[root][p] = 1;
  //	cout<<root<<" "<<p<<" "<<sumi[1][1]<<endl;
  for (int i = 0; i < G[p].size(); i++) {
    if (sumi[root][G[p][i]] == 1)
      continue;
    ch(root, G[p][i]);
  }
  return;
}

signed main() {

  while (1) {
    int n;
    cin >> n;
    if (n == 0)
      return 0;
    for (int i = 0; i < 2000; i++) {
      G[i].clear();
      for (int j = 0; j < 50; j++)
        sumi[j][i] = 0;
    }

    for (int i = 0; i < 30; i++) {
      for (int j = 0; j < n; j++)
        G[i * 50 + j].pb(i * 50 + j + 50);
    }

    for (int i = 0; i < n; i++) {
      int l;
      cin >> l;
      for (int j = 0; j < l; j++) {
        int u;
        cin >> u;
        G[(u - 1) * 50 + i].pb(1600 + u);
        G[1600 + u].pb(u * 50 + i);
        //	cout<<" "<<u*50+i<<" "<<1600+u<<endl;
      }
    }

    //	cout<<sumi[1][1]<<endl;
    for (int i = 0; i < n; i++)
      ch(i, i);

    int r = 31;
    for (int i = 50; i < 1550; i++) {
      int d = 0;
      for (int j = 0; j < n; j++)
        if (sumi[j][i])
          d++;
      //	cout<<d<<endl;
      if (d == n) {
        r = i / 50;
        break;
      }
    }
    if (r == 31)
      cout << -1 << endl;
    else
      cout << r << endl;
  }

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------
int par[200100], ranks[200100], kosuu[200100];

void shoki(int n) {
  for (int i = 0; i < n; i++) {
    par[i] = i;
    ranks[i] = 0;
    kosuu[i] = 1;
  }
}

int root(int x) { return par[x] == x ? x : par[x] = root(par[x]); }

bool same(int x, int y) { return root(x) == root(y); }

void unite(int x, int y) {
  x = root(x);
  y = root(y);
  int xx = kosuu[x], yy = kosuu[y];
  if (x == y)
    return;
  if (ranks[x] < ranks[y]) {
    par[x] = y;
    kosuu[y] = yy + xx;
  } else {
    par[y] = x;
    if (ranks[x] == ranks[y])
      ranks[x] = ranks[x] + 1;
    kosuu[x] = yy + xx;
  }
  return;
}

signed main() {

  while (1) {
    int n;
    cin >> n;
    if (n == 0)
      return 0;
    shoki(1000);
    vector<int> ve[31];
    for (int i = 0; i < n; i++) {
      int l;
      cin >> l;
      for (int j = 0; j < l; j++) {
        int u;
        cin >> u;
        ve[u].pb(i + 1);
      }
    }

    int r = 1;
    int co = 0;
    while (1) {
      for (int i = 0; i < ve[r].size(); i++) {
        if (!same(0, ve[r][i])) {
          co++;
          unite(0, ve[r][i]);
        }
      }
      if (co == n)
        break;
      r++;
    }
    cout << r << endl;
  }

  return 0;
}