#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
const int MAXX = 1000 + 1;
const int MAXY = MAXX;
int n;
int v[MAXN][2];
bool vis[MAXN];
vector<int> adjx[MAXX];
vector<int> adjy[MAXY];
void build_graph() {
  int i;
  for (i = (0); i < (n); i++) {
    adjx[v[i][0]].push_back(i);
    adjy[v[i][1]].push_back(i);
  }
}
void dfs(int node) {
  int i, j, x, y, m;
  vis[node] = true;
  x = v[node][0];
  y = v[node][1];
  m = (int)adjx[x].size();
  for (i = (0); i < (m); i++) {
    j = adjx[x][i];
    if (!vis[j]) {
      dfs(j);
    }
  }
  m = (int)adjy[y].size();
  for (i = (0); i < (m); i++) {
    j = adjy[y][i];
    if (!vis[j]) {
      dfs(j);
    }
  }
}
int components() {
  int i, ans;
  ans = 0;
  memset(vis, false, n);
  build_graph();
  ans = 0;
  for (i = (0); i < (n); i++) {
    if (!vis[i]) {
      dfs(i);
      ans++;
    }
  }
  return ans;
}
int main(int argc, char *argv[]) {
  int i;
  scanf("%d", &n);
  for (i = (0); i < (n); i++) {
    scanf("%d%d", &v[i][0], &v[i][1]);
  }
  printf("%d\n", components() - 1);
  return 0;
}
