
import networkx as nx

# Solucions de parada_mes_propera
## 1

def parada_mes_propera_1(g, x):
    nodemin = min(g[x], key=lambda n:g[n][x]['temps'])
    tmin = g[x][nodemin]['temps']
    return nodemin, tmin

## 2

def parada_mes_propera_2(g, x):
    _, nodemin, tmin = min(g.edges(x, data='temps'), key=lambda t: t[-1])
    return nodemin, tmin

parada_mes_propera = parada_mes_propera_2


# Solucions de nombre_de_transbordaments
## 1
            
def nombre_de_transbordaments_1(g, p1, p2):
    nt = 0
    trajecte = nx.shortest_path(g, p1, p2, weight='temps')
    for i in range(len(trajecte)-2):
        a = trajecte[i]
        b = trajecte[i+1]
        c = trajecte[i+2]
        if g[a][b]['linia'] != g[b][c]['linia']:
            nt = nt + 1
    return nt

## 2, iteradors, map, filter i sum

from itertools import pairwise

def nombre_de_transbordaments_2(g, p1, p2):
    trajecte = nx.shortest_path(g, p1, p2, weight='temps')
    linies = map(lambda tp: g[tp[0]][tp[1]]['linia'], pairwise(trajecte))
    canvis = filter(lambda tl: tl[0] != tl[1], pairwise(linies))
    return sum(map(lambda pl: 1, canvis))

## 3, expressions generadores i sum

def nombre_de_transbordaments_3(g, p1, p2):
    trajecte = nx.shortest_path(g, p1, p2, weight='temps')
    linies = (g[a][b]['linia'] for a, b in pairwise(trajecte))
    return sum(1 for a, b in pairwise(linies) if a != b)

nombre_de_transbordaments = nombre_de_transbordaments_3
