Problem p02762 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using Graph = vector<vector<int>>;
using block = vector<vector<int>>;

vector<int> num;
vector<int> seen;
int groupsize[50001];
int group = 1; // グループ番号
void dfs(const Graph &G, int v) {
  seen[v] = group; // v を訪問済にする
  groupsize[group]++;
  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v])
      continue;     // next_v が探索済だったらスルー
    dfs(G, next_v); // 再帰的に探索
  }
}

int main() {
  int n, m, k;
  cin >> n >> m >> k;
  int ans = 0;
  typedef pair<int, int> pair;
  map<pair, int> mp;

  Graph G(n);
  block bl(n);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    mp[pair(a, b)] = 1; // 友達
    mp[pair(b, a)] = 1;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int i = 0; i < k; i++) {
    int c, d;
    cin >> c >> d;
    c--;
    d--;
    mp[pair(c, d)] = 2; // ブロック
    mp[pair(d, c)] = 2;
    bl[c].push_back(d);
    bl[d].push_back(c);
  }

  // 頂点 0 をスタートとした探索
  seen.assign(n, 0); // 全頂点を「未訪問」に初期化
  for (int i = 0; i < n; i++) {
    if (seen[i] == 0) {
      dfs(G, i);
      group++;
    }
  }

  num.assign(n, -1);
  for (int i = 0; i < n; i++) {
    ans = groupsize[seen[i]] - 1;
    for (int j = 0; j < G[i].size(); j++) {
      // cout << "[" << bl[i][j] << "]";
      if (seen[i] == seen[G[i][j]])
        ans--;
    }
    for (int j = 0; j < bl[i].size(); j++) {
      // cout << "[" << bl[i][j] << "]";
      if (seen[i] == seen[bl[i][j]])
        ans--;
    }
    cout << ans << " ";
    // cout << endl;
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using Graph = vector<vector<int>>;
using block = vector<vector<int>>;

vector<int> num;
vector<int> seen;
int groupsize[100001];
int group = 1; // グループ番号
void dfs(const Graph &G, int v) {
  seen[v] = group; // v を訪問済にする
  groupsize[group]++;
  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v])
      continue;     // next_v が探索済だったらスルー
    dfs(G, next_v); // 再帰的に探索
  }
}

int main() {
  int n, m, k;
  cin >> n >> m >> k;
  int ans = 0;
  typedef pair<int, int> pair;
  map<pair, int> mp;

  Graph G(n);
  block bl(n);
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    mp[pair(a, b)] = 1; // 友達
    mp[pair(b, a)] = 1;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int i = 0; i < k; i++) {
    int c, d;
    cin >> c >> d;
    c--;
    d--;
    mp[pair(c, d)] = 2; // ブロック
    mp[pair(d, c)] = 2;
    bl[c].push_back(d);
    bl[d].push_back(c);
  }

  // 頂点 0 をスタートとした探索
  seen.assign(n, 0); // 全頂点を「未訪問」に初期化
  for (int i = 0; i < n; i++) {
    if (seen[i] == 0) {
      dfs(G, i);
      group++;
    }
  }

  num.assign(n, -1);
  for (int i = 0; i < n; i++) {
    ans = groupsize[seen[i]] - 1;
    for (int j = 0; j < G[i].size(); j++) {
      // cout << "[" << bl[i][j] << "]";
      if (seen[i] == seen[G[i][j]])
        ans--;
    }
    for (int j = 0; j < bl[i].size(); j++) {
      // cout << "[" << bl[i][j] << "]";
      if (seen[i] == seen[bl[i][j]])
        ans--;
    }
    cout << ans << " ";
    // cout << endl;
  }

  return 0;
}