#include <bits/stdc++.h>
using namespace std;
vector<int> x_coord, y_coord;
vector<vector<int>> adj;
vector<bool> used;
int n;
void dfs(int v) {
  used[v] = true;
  for (auto u : adj[v]) {
    if (!used[u]) {
      used[u] = true;
      dfs(u);
    }
  }
}
int main() {
  scanf("%d", &n);
  x_coord.resize(n);
  y_coord.resize(n);
  adj.resize(n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &x_coord[i], &y_coord[i]);
    for (int j = 0; j < i; j++) {
      if (x_coord[j] == x_coord[i] || y_coord[j] == y_coord[i]) {
        adj[i].push_back(j);
        adj[j].push_back(i);
      }
    }
  }
  used.resize(n, false);
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      cnt++;
      dfs(i);
    }
  }
  printf("%d\n", cnt - 1);
  return 0;
}
