Problem p02762 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;

#define rep(i, n) for (int i = 0; i < (n); i++)

typedef long long ll;

#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
// 略記
#define PB push_back // vectorヘの挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

struct UnionFind {
  vector<int> d; // 親の番号、但し根の場合はサイズのマイナス
  UnionFind(int n) : d(n, -1) {}
  int root(int x) { // 根を見つける
    if (d[x] < 0)
      return x;
    return d[x] = root(d[x]); // 経路圧縮
  }
  bool unite(int x, int y) { // 結合
    x = root(x);
    y = root(y);
    if (x == y)
      return false;
    if (d[x] > d[y])
      swap(x, y);
    d[x] += d[y];
    d[y] = x;
    return true;
  }
  bool same(int x, int y) { return root(x) == root(y); } // 親が一緒
  int size(int x) { return -d[root(x)]; }                // サイズ
};

int main() {
  int N, M, K;
  cin >> N >> M >> K;
  UnionFind uf(N);
  int a, b;
  vector<vector<int>> A(N);
  rep(i, M) {
    cin >> a >> b;
    a--;
    b--;
    uf.unite(a, b);
    A[a].push_back(b);
    A[b].push_back(a);
  }
  rep(i, K) {
    cin >> a >> b;
    a--;
    b--;
    A[a].push_back(b);
    A[b].push_back(a);
  }
  rep(i, N) {
    int ans = 0;
    rep(j, N) {
      if (i == j)
        continue;
      if (uf.same(i, j)) {
        bool b = true;
        for (int a : A[i]) {
          b &= (a != j);
        }
        if (b)
          ans++;
      }
    }
    cout << ans << " ";
  }
  cout << endl;
  return 0;
}


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

#define rep(i, n) for (int i = 0; i < (n); i++)

typedef long long ll;

#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
// 略記
#define PB push_back // vectorヘの挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

struct UnionFind {
  vector<int> d; // 親の番号、但し根の場合はサイズのマイナス
  UnionFind(int n) : d(n, -1) {}
  int root(int x) { // 根を見つける
    if (d[x] < 0)
      return x;
    return d[x] = root(d[x]); // 経路圧縮
  }
  bool unite(int x, int y) { // 結合
    x = root(x);
    y = root(y);
    if (x == y)
      return false;
    if (d[x] > d[y])
      swap(x, y);
    d[x] += d[y];
    d[y] = x;
    return true;
  }
  bool same(int x, int y) { return root(x) == root(y); } // 親が一緒
  int size(int x) { return -d[root(x)]; }                // サイズ
};

int main() {
  int N, M, K;
  cin >> N >> M >> K;
  UnionFind uf(N);
  int a, b;
  vector<vector<int>> A(N);
  rep(i, M) {
    cin >> a >> b;
    a--;
    b--;
    uf.unite(a, b);
    A[a].push_back(b);
    A[b].push_back(a);
  }
  rep(i, K) {
    cin >> a >> b;
    a--;
    b--;
    A[a].push_back(b);
    A[b].push_back(a);
  }
  rep(i, N) {
    int ans = uf.size(i) - 1;
    for (int a : A[i]) {
      if (uf.same(i, a))
        ans--;
    }
    cout << ans << " ";
  }
  cout << endl;
  return 0;
}