def newDPA(n, m):
    '''
    DPA Algorithm to generate random directed graphs
    :param n: number of nodes
    :param m: integer (1 <= m <= n)
    :return:A directed graph
    '''
    gE = graph_util.make_complete_graph(m)
    dpat = dh.DPATrial(m)
    for i in range(m, n):
        # V1 = select_random_nodes(gE, m, indeg, totindeg)
        V1 = dpat.run_trial(m)
        gE[i] = set(V1)
    return gE
def generate_UPA(n, m):
    '''
    UPA Algorithm to generate random undirected graphs
    :param n: number of nodes
    :param m: integer (1 <= m <= n)
    :return:A directed graph
    '''
    gE = graph_util.make_complete_graph(m)
    dpat = uh.UPATrial(m)
    for i in range(m, n):
        # V1 = select_random_nodes(gE, m, indeg, totindeg)
        V1 = dpat.run_trial(m)
        gE[i] = set(V1)
        for neighbour in V1:
            gE[neighbour].add(i)
    return gE
def DPA(n, m):
    '''
    DPA Algorithm to generate random directed graphs
    :param n: number of nodes
    :param m: integer (1 <= m <= n)
    :return:A directed graph
    '''
    gE = graph_util.make_complete_graph(m)
    indeg = graph_util.compute_in_degrees(gE)
    totindeg = totalindeg(indeg)
    for i in range(m, n):
        V1 = select_random_nodes(gE, m, indeg, totindeg)
        gE[i] = set(V1)
        for j in V1:
            indeg[j] = indeg[j] + 1
        indeg[i] = 0
        totindeg = totindeg + len(V1)
    return gE