Recursos-LCC

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

View on GitHub

LA2 | Treino 2 | Viagem


'''
Implemente uma função que calcula o preço mais barato para fazer uma viagem de
autocarro entre duas cidades. A função recebe (para além das duas cidades) uma
lista de rotas de autocarro, onde cada rota é uma sequência de cidades por onde
passa o autocarro, intercalada com o custo para viajar entre cada par de cidades.
Assuma que cada rota funciona nos dois sentidos.
'''

def build(rotas):
    adj = {}
    for rota in rotas:
        for i in range(0,len(rota)-2,2):
            c1 = rota[i]
            p = rota[i+1]
            c2 = rota[i+2]
            if c1 not in adj:
                adj[c1] = {}
            if c2 not in adj:
                adj[c2] = {}
            adj[c1][c2] = p
            adj[c2][c1] = p
    return adj


def fw(adj):
    dist = {}
    for o in adj:
        dist[o] = {}
        for d in adj:
            if o == d:
                dist[o][d] = 0
            elif d in adj[o]:
                dist[o][d] = adj[o][d]
            else:
                dist[o][d] = float("inf")
    for k in adj:
        for o in adj:
            for d in adj:
                if dist[o][k] + dist[k][d] < dist[o][d]:
                    dist[o][d] = dist[o][k] + dist[k][d]
    return dist


def viagem(rotas,o,d):
    adj = build(rotas)
    if not len(adj):    # verifica se o grafo não está vazio
        return 0
    res = fw(adj)
    return res[o][d]


Testes

# 1
rotas = [["Porto",20,"Lisboa"],
        ["Braga",3,"Barcelos",4,"Viana",3,"Caminha"],
        ["Braga",3,"Famalicao",3,"Porto"],
        ["Viana",4,"Povoa",3,"Porto"],
        ["Lisboa",10,"Evora",8,"Beja",8,"Faro"]]
o = "Caminha"
d = "Lisboa"
> Resultado = 30

# 2
rotas = [["Porto",20,"Lisboa"],
        ["Braga",3,"Barcelos",4,"Viana",3,"Caminha"],
        ["Braga",3,"Famalicao",3,"Porto"],
        ["Viana",4,"Povoa",3,"Porto"],
        ["Lisboa",10,"Evora",8,"Beja",8,"Faro"],
        ["Porto",15,"Lisboa",20,"Faro"]]
o = "Braga"
d = "Faro"
> Resultado = 41

retroceder