

verticies = []

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)

graph = dict()

d_x = dict()
d_y = dict()


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

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

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

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

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

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

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

#print(graph)


n_komponent = 0

from collections import deque



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

verticies_set = set(verticies)

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

    unvisited_vertex = list(verticies_set.difference(visited_all))[0]

    #print(unvisited_vertex)


    visited.add(unvisited_vertex)
    visited_all.add(unvisited_vertex)
    q.append(unvisited_vertex)

    while len(q) > 0:
        curr = q.popleft()
        sousedi = graph[curr]

        for s in sousedi:
            if s not in visited:
                visited.add(s)
                visited_all.add(s)
                q.append(s)
    
    n_komponent += 1






print(n_komponent-1)
    
