#include <bits/stdc++.h>
using namespace std;
int a[1000 + 3][1000 + 3];
int used[1000 + 3][1000 + 3];
int n;
void dfs(int x, int y) {
  used[x][y] = 1;
  for (int i = 0; i <= 1001; i++) {
    if (!used[x][i] && a[x][i]) dfs(x, i);
  }
  for (int i = 0; i <= 1001; i++) {
    if (!used[i][y] && a[i][y]) dfs(i, y);
  }
}
int main() {
  cin >> n;
  int tmp1, tmp2;
  for (int i = 0; i < n; i++) {
    cin >> tmp1 >> tmp2;
    a[tmp1][tmp2] = 1;
  }
  int ans = 0;
  for (int i = 0; i <= 1001; i++) {
    for (int j = 0; j <= 1001; j++) {
      if (a[i][j] && !used[i][j]) {
        dfs(i, j);
        ans++;
      }
    }
  }
  cout << --ans;
  return 0;
}
