Problem p03575 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll MOD = 1000000007;

#define vec vector<int>
#define vecll vector<ll>
#define vecd vector<double>
#define vecst vector<string>
#define vecb vector<bool>
#define v2(v, n, m, init) vector<vector<int>> v(n, vector<int>(m, init))
#define vb2(v, n, m, init) vector<vector<bool>> v(n, vector<bool>(m, init))
#define vll2(v, n, m, init) vector<vector<ll>> v(n, vector<ll>(m, init))

#define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++)
#define REP(i, m, n) for (ll i = (ll)m; i < (ll)n; i++)
#define arr(var, n)                                                            \
  vec var(n);                                                                  \
  rep(i, n) { cin >> var[i]; }
#define arrll(var, n)                                                          \
  vecll var(n);                                                                \
  rep(i, n) { cin >> var[i]; }
#define arrst(var, n)                                                          \
  vecst var(n);                                                                \
  rep(i, n) { cin >> var[i]; }
#define all(var) (var).begin(), (var).end()
#define sortall(var) sort(all(var))
#define uniqueall(v) v.erase(unique(v.begin(), v.end()), v.end());
#define pb(var) push_back(var)
#define prt(var) cout << (var) << "\n"
#define prtd(n, var) cout << fixed << setprecision(n) << (var) << "\n"
#define prtfill(n, var) cout << setw(n) << setfill('0') << (var);
#define prt2(v1, v2) cout << (v1) << " " << (v2) << "\n"
#define prt3(v1, v2, v3) cout << (v1) << " " << (v2) << " " << (v3) << "\n"
#define prtall(v)                                                              \
  rep(i, v.size()) { cout << v[i] << (i != v.size() - 1 ? " " : "\n"); }
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
//------------------------------------------------------------------
class UnionFind {

public:
  int vertexNumber;
  vector<int> parents;

  UnionFind(int n) {
    vertexNumber = n;
    parents.assign(n, -1);
  }
  ~UnionFind() {}

  int find(int x) {
    if (parents[x] < 0) {
      return x;
    } else {
      return find(parents[x]);
    }
  }

  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }

    if (parents[x] > parents[y]) {
      int tmp = x;
      x = y;
      y = tmp;
    }

    parents[x] += parents[y];
    parents[y] = x;
  }

  int size(int x) { return -parents[find(x)]; }

  bool is_same(int x, int y) { return find(x) == find(y); }

  int count_roots() {
    int ct = 0;
    for (int i = 0; i < vertexNumber; i++) {
      if (parents[i] < 0) {
        ct++;
      }
    }
    return ct;
  }
};

int main(void) {
  int n, m;
  cin >> n >> m;
  vec a(m), b(m);
  rep(i, m) { cin >> a[i] >> b[i]; }

  int ans = 0;
  rep(i, m) {
    UnionFind uf(n);
    rep(j, m) {
      if (i == j)
        continue;
      uf.unite(a[j], b[j]);
    }
    if (uf.size(a[i]) != n)
      ans++;
  }

  prt(ans);
}


Fixed submission:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll MOD = 1000000007;

#define vec vector<int>
#define vecll vector<ll>
#define vecd vector<double>
#define vecst vector<string>
#define vecb vector<bool>
#define v2(v, n, m, init) vector<vector<int>> v(n, vector<int>(m, init))
#define vb2(v, n, m, init) vector<vector<bool>> v(n, vector<bool>(m, init))
#define vll2(v, n, m, init) vector<vector<ll>> v(n, vector<ll>(m, init))

#define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++)
#define REP(i, m, n) for (ll i = (ll)m; i < (ll)n; i++)
#define arr(var, n)                                                            \
  vec var(n);                                                                  \
  rep(i, n) { cin >> var[i]; }
#define arrll(var, n)                                                          \
  vecll var(n);                                                                \
  rep(i, n) { cin >> var[i]; }
#define arrst(var, n)                                                          \
  vecst var(n);                                                                \
  rep(i, n) { cin >> var[i]; }
#define all(var) (var).begin(), (var).end()
#define sortall(var) sort(all(var))
#define uniqueall(v) v.erase(unique(v.begin(), v.end()), v.end());
#define pb(var) push_back(var)
#define prt(var) cout << (var) << "\n"
#define prtd(n, var) cout << fixed << setprecision(n) << (var) << "\n"
#define prtfill(n, var) cout << setw(n) << setfill('0') << (var);
#define prt2(v1, v2) cout << (v1) << " " << (v2) << "\n"
#define prt3(v1, v2, v3) cout << (v1) << " " << (v2) << " " << (v3) << "\n"
#define prtall(v)                                                              \
  rep(i, v.size()) { cout << v[i] << (i != v.size() - 1 ? " " : "\n"); }
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
//------------------------------------------------------------------
class UnionFind {

public:
  int vertexNumber;
  vector<int> parents;

  UnionFind(int n) {
    vertexNumber = n;
    parents.assign(n, -1);
  }
  ~UnionFind() {}

  int find(int x) {
    if (parents[x] < 0) {
      return x;
    } else {
      return find(parents[x]);
    }
  }

  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) {
      return;
    }

    if (parents[x] > parents[y]) {
      int tmp = x;
      x = y;
      y = tmp;
    }

    parents[x] += parents[y];
    parents[y] = x;
  }

  int size(int x) { return -parents[find(x)]; }

  bool is_same(int x, int y) { return find(x) == find(y); }

  int count_roots() {
    int ct = 0;
    for (int i = 0; i < vertexNumber; i++) {
      if (parents[i] < 0) {
        ct++;
      }
    }
    return ct;
  }
};

int main(void) {
  int n, m;
  cin >> n >> m;
  vec a(m), b(m);
  rep(i, m) {
    cin >> a[i] >> b[i];
    a[i]--;
    b[i]--;
  }

  int ans = 0;
  rep(i, m) {
    UnionFind uf(n);
    rep(j, m) {
      if (i == j)
        continue;
      uf.unite(a[j], b[j]);
    }
    if (uf.size(a[i]) != n)
      ans++;
  }

  prt(ans);
}