Recursos-LCC

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

View on GitHub

LA2 | Treino 4 | Cobertura


'''
Implemente uma função que calcula o número mínimo de nós de um grafo 
não orientado que cobrem todas as arestas, ou seja, o tamanho do menor 
conjunto de nós que contém pelo menos um extremo de cada aresta. 
A função recebe a lista de todas as arestas do grafo, sendo cada aresta um 
par de nós.
'''


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

# enumera as extensões válidas para o candidato parcial c
def extensions(p,c,g):
    if len(c) == 0:
        return p
    else:
        return filter(lambda x: x>=c[-1], p)

# testa se um candidato c é uma solução válida para p
def valid(p,c,g):
    for a,b in g:
        if a not in c and b not in c:
            return False
    return True

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

def cobertura(arestas):
    grafo = {}
    for a,b in arestas:
        if a not in grafo:
            grafo[a] = set()
        if b not in grafo:
            grafo[b] = set()
        grafo[a].add(b)
    for i in range(0, len(grafo.keys())+1):
        if aux(sorted(list(grafo.keys())),[],i,arestas):
            return i


Testes

# 1
arestas = [('portugal','espanha'),('espanha','franca'),('franca','alemanha'),('alemanha','belgica'),('belgica','franca'),('usa','canada'),('usa','mexico'),('marrocos','argelia'),('argelia','libia'),('argelia','mali')]
> Resultado = 5

# 2
arestas = [('a','b'),('b','c'),('c','d'),('d','e'),('e','f'),('f','g'),('g','h')]
> Resultado = 4

retroceder