verticies = []

n_vertex = 0

d_x = dict()
d_y = dict()


#index_to_coords = dict()
coords_to_index = dict()


n = int(input()) 
for i in range(n):
    line = input().split()
    x = int(line[0])
    y = int(line[1])
    coords = (x,y)

    verticies.append(coords)
    #index_to_coords[i] = coords
    coords_to_index[coords] = i

    n_vertex += 1

    if not (x in d_x):
        d_x[x] = []
    if not (y in d_y):
        d_y[y] = []

    d_y[y].append(coords)
    d_x[x].append(coords)
    
    

n_komponent = 0

from collections import deque

visited_all = [False for i in range(n_vertex)] ##if v[i] true then vertex i was visited
n_visited = 0

q = deque()

i = 0


while(n_visited<n_vertex):  #len(visited_all) < n_vertex):
    q = deque()

    ## get correct i:
    for j in range(i,n_vertex):
        if not visited_all[j]:
            i = j
            break

    unvisited_vertex = verticies[i]

    visited_all[i] = True
    n_visited+=1
    q.append(unvisited_vertex)

    while len(q) > 0:
        curr = q.popleft()
        c_x = curr[0]
        c_y = curr[1]
        sousedi_x = d_x[c_x]
        sousedi_y = d_y[c_y]

        for s in sousedi_x:
            s_index = coords_to_index[s]

            if not visited_all[s_index]:
                visited_all[s_index] = True
                n_visited+=1
                q.append(s)
        
        for s in sousedi_y:
            s_index = coords_to_index[s]

            if not visited_all[s_index]:
                visited_all[s_index] = True
                n_visited+=1
                q.append(s)

    n_komponent += 1


print(n_komponent-1)
    
