Note - The program takes about 5-6 minutes. Although the implementation uses a linear solution to find the disconnected components, python slows it down :(. Prime number generation alone takes up about 1 minute for all the inputs of the large dataset. Comparison between Union-find and undirected-graph on large Dataset: UnionFind - 6m 14s Undirected Graph - 5m 37s """ import os import sys import math sys.path.append(os.path.abspath('./src/helpers')) from math_utils import prime_numbers from graphs import Graph f = open(sys.argv[1]) T = int(f.readline().strip()) for cc in range(T): # integer lists A, B, P = map(int, f.readline().strip().split(" ")) p_nums = prime_numbers(min(B / 2 + 1, B - A)) - set(range(P)) g = Graph(range(A, B + 1)) for i in p_nums: start = int(i * (math.ceil(A / float(i)))) for j in range(start + i, B + 1, i): g.add_unidrected_edge(start, j) print("Case #%d: %s" % (cc + 1, str(g.num_connected_components()))) f.close()