Recursos-LCC

Um arquivo de todo material que consegui reunir, pertinente ao curso de LCC da UM.

View on GitHub

LA2 | Treino 4 | União


'''
Implemente uma função que dada uma lista de conjuntos de inteiros determine qual
o menor número desses conjuntos cuja união é idêntica à união de todos os 
conjuntos recebidos.
'''


# testa se o candidato c está completo
def complete(p,c,i,ind):
    return len(c) == i

# enumera as extensões válidas para o candidato parcial c
def extensions(p,c,ind):
    return [a for a in p if p.index(a)>ind and a not in c]

# testa se um candidato c é uma solução válida para p
def valid(p,c,m):
    new = set()
    for cand in c:
        new = new.union(cand)
    return len(new) == len(m)


def aux(p,c,i,m, ind):
    if complete(p,c,i,ind):
        return valid(p,c,m)
    
    for x in extensions(p,c,ind):
        c.append(x)
        if aux(p,c,i,m,p.index(x)):
            return True
        c.pop()
    return False


def uniao(sets):
    flag = True
    max_set = set()
    
    for sett in sets:
        if max_set.intersection(sett):
            flag = False
        max_set = max_set.union(sett)
        
    if flag:
        return len(sets)
    
    for i in range(0, len(sets)+1):
        if aux(sets, [], i, max_set, -1):
            return i
    return len(sets)


Testes

# 1
sets = [{1,2,3},{2,4},{3,4},{4,5}]
> Resultado = 2

# 2
sets = [{1},{2},{3,4},{5,6,7,8},{1,3,5,7},{2,4,6,8},{9}]
> Resultado = 3

retroceder