#include <bits/stdc++.h>
#define  M 10000

using namespace std;
typedef long long ll;
int mini=0;
struct zlatnici{
    ll r;
    ll k;

};
bool isSafe(bool m[][M],ll n,ll i,ll j){
    if(!m[i][j]&& i<n && i>=0 && j<n && j>=0)
        return true;
    return false;
}
void sortiraj(zlatnici a[],int n){
  for(int i=0;i<n-1;i++)
  for(int j=i+1;j<n;j++){
    if(a[i].r>a[j].r){
        zlatnici pom=a[i];
        a[i]=a[j];
        a[j]=pom;
    }
  }

}
bool pomeri(bool kol[],bool red[],bool m[][M],int n,int j,int i){
    if(!kol[j]&&!red[i]&&!m[i][j]){
       // mini++;
        m[i][j]=true;
        kol[j]=true;
        red[i]=true;
        return true;
    }
    if(isSafe(m,n,i,j)){
            mini++;
        if(pomeri(kol,red,m,n,j,i+1)){
           // mini++;
            return true;
        }
        else if(pomeri(kol,red,m,n,j,i-1)){
            //mini++;
            return true;
        }
        else if(pomeri(kol,red,m,n,j+1,i)){
           // mini++;
            return true;
        }
        else if(pomeri(kol,red,m,n,j-1,i)){
           // mini++;
            return true;
        }
        mini--;
        return false;
    }



}
void minibroj(zlatnici a[],int n){
    bool kol[n]={false};
    bool red[n]={false};
    bool m[n][M]={false};
    for(int i=0;i<n;i++){
        m[a[i].r][a[i].k]=true;
    }
    for(int i=0;i<n;i++){
       if(!red[a[i].r]&&!kol[a[i].k]){
           red[a[i].r]=true;
           kol[a[i].k]=true;
        }
        else
        {
              m[a[i].r][a[i].k]=false;
              pomeri(kol,red,m,n,a[i].k,a[i].r);
        }
    }

}

int main()
{
   ll n;
   cin >> n;
   zlatnici a[n];
   int b,c;
   for(int i=0;i<n;i++){
        cin >> b >> c;
        a[i].r=b-1;
        a[i].k=c-1;
   }
   if(n==2&&a[0].r==a[1].r)cout << 1 << " ";
   else{
    sortiraj(a,n);
    minibroj(a,n);
   if(mini>2)  mini-=n%2;
    cout << mini << '\n';
   }
    return 0;
}