def ObterD(G, M):
	D = GrafoListaAdj(orientado = True)
	D.DefinirN(G.n+1)
	D.tV1 = G.tV1
	D.Exp = [False]*(D.n+1)
	for v in range(1, D.n):
		D.Exp[v] = (M[v] == None)
	for v in range(1, G.tV1+1):
		if D.Exp[v]:
			D.AdicionarAresta(D.n, v)
		for w in G.N(v):
			if M[v] == w:
				D.AdicionarAresta(w,v)
			else:
				D.AdicionarAresta(v,w)
	
	return D
def Aumentante(G, M):
    #Construcao de Df
    Df = GrafoListaAdj(orientado=True)
    Df.DefinirN(G.n)
    Df.ExpAssoc = [None] * (Df.n + 1)
    for v in G.V():
        for w in G.N(v):
            if M[w] != v:  #vw nao esta em M
                if M[w] == None:
                    Df.ExpAssoc[v] = w
                else:
                    e = Df.AdicionarAresta(v, M[w])
                    e.inter = w
    Df.Exp = [True] * (Df.n + 1)
    for v in M:
        if v != None:
            Df.Exp[v] = False

    Pf = BuscaCamAumentante(Df)

    (P, F, H) = CONSTRUCAO_3(Pf, Df, G, M)

    return (P, F, H)