

verticies = []
n_vertex = 0


d_x = dict()
d_y = dict()

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

    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)
    verticies.append(coords)

#graph = dict()


"""
for v in verticies:
    x = v[0]
    y = v[1]
"""
    

"""
for v in verticies:
    graph[v] = []
    x = v[0]
    y = v[1]

    sousedi_v_x = d_x[x].copy()
    sousedi_v_y = d_y[y].copy()
    #sousedi_v_x.remove(v)
    #sousedi_v_y.remove(v)

    #sousedi_v_x = list(sousedi_v_x)
    #sousedi_v_y = list(sousedi_v_y)
    a = list()
    

    sousedi_v_x.extend(sousedi_v_y) #sousedi_v_x.union(sousedi_v_y)
    sousedi = sousedi_v_x
    graph[v] = sousedi

#print(graph)
"""

n_komponent = 0

from collections import deque



visited_all = set()
visited = set()
q = deque()

#verticies_set = set(verticies)

i = 0

while(len(visited_all) < n_vertex):
    visited = set()
    q = deque()

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

    unvisited_vertex = verticies[i] ##(verticies_set.difference(visited_all))



    visited.add(unvisited_vertex)
    visited_all.add(unvisited_vertex)
    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] #graph[curr]
        sousedi_y = d_y[c_y]

        for s in sousedi_x:
            if s not in visited and s != curr:
                visited.add(s)
                visited_all.add(s)
                q.append(s)
        
        for s in sousedi_y:
            if s not in visited and s != curr:
                visited.add(s)
                visited_all.add(s)
                q.append(s)

    
    n_komponent += 1


print(n_komponent-1)
    
