Recursos-LCC

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

View on GitHub

LA2 | Treino 4 | Amigos


'''
Implemente uma função que descubra o maior conjunto de pessoas que se conhece 
mutuamente. A função recebe receber uma sequências de pares de pessoas que se 
conhecem e deverá devolver o tamanho do maior conjunto de pessoas em que todos 
conhecem todos os outros.
'''


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


# enumera as extensões válidas para o candidato parcial c
def extensions(p,c,l,g):
    if len(c) == 0:
        return l
    else:
        r = list()
        for new in filter(lambda x: x>c[-1], l):
            for old in c:
                if new not in g[old] or old not in g[new]:
                    break
            else:
                r.append(new)
        return r


# testa se um candidato c é uma solução válida para p
def valid(p,c):
    return True


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


def amigos(conhecidos):
    grafo = {}
    for x,y in conhecidos:
        if x not in grafo:
            grafo[x] = set()
        if y not in grafo:
            grafo[y] = set()
        grafo[x].add(y)
        grafo[y].add(x)
    
    for i in range(len(grafo.keys()), 0, -1):
        c = []
        if aux(conhecidos, c, i, (list(grafo.keys())), grafo):
            return i
    return 0


Testes

# 1
conhecidos = {('pedro','maria'),('pedro','jose'),('pedro','manuel'),('maria','jose'),('maria','francisca'),('jose','francisca'),('francisca','manuel')}
> Resultado = 3

# 2
conhecidos = {('pedro','maria'),('jose','francisca'),('manuel','pedro')}
> Resultado = 2

retroceder