def get_diable_universe(candidates, cluster_nodes, neighbors):
    """
    Compute the DiaBLE universe as the union of the seed genes, 
    the genes that have at least one link to the seed set (candidate genes) 
    and their first neighbors.

    :param candidates: candidate genes at iteration k
    :param cluster_nodes: seed genes at iteration k
    :param neighbors: precomputed dictionary of all the nodes in the graph and their neighbors

    :return DiaBLE universe at iteration k
    """
    candidate_neighbors = set()
    for candidate in candidates:
        candidate_neighbors |= set(neighbors[candidate])
    return cluster_nodes | candidates | candidate_neighbors