Xarxa de metro amb temps ======================== En aquest problema treballarem amb la representació de la xarxa de metro d'una ciutat que ja coneixeu. Ara bé, en aquest cas les arestes del graf entre dues parades de metro no només tindran una etiqueta :py:const:`'linia'` que indica la línia de metro a la qual pertanyen, sinó que hi afegirem una segona etiqueta, de nom :py:const:`'temps'`, que indicarà el temps que es triga a realitzar el trajecte entre les dues parades. Vegeu-ne un exemple: .. figure:: metro-temps.svg :align: center Xarxa de metro d'una ciutat amb dues etiquetes a cada aresta (:py:const:`'linia'` i :py:const:`'temps'`). Cada línia de metro està pintada d'un color diferent. El valor mostrat al costat de cada aresta és el temps que es triga a anar d'una parada a l'altra (en segons). .. admonition:: Suggeriment Al fitxer :download:`crea.py` disposeu de la funció `crea_graf()`, que retorna un graf com el de l'exemple. Descarregueu-lo, que us anirà bé per a fer les proves. A més a més, els doctests el fan servir. .. py:module:: metro4 Funció `parada_mes_propera` (2 punts) ------------------------------------- Al mòdul :py:mod:`metro4` (fitxer :file:`metro4.py`), implementeu-hi la funció següent: .. function:: parada_mes_propera(g, np) :param ~networkx.Graph g: Graf que representa la xarxa de metro d'una ciutat :param str np: Nom d'una parada de metro :return: Tupla amb dues components: nom de la parada més propera en temps de `np` i segons que es triga per anar-hi. Si la parada més propera no és única, la funció retorna el nom de qualsevol d'elles. Per exemple, si `g` és el graf de l'exemple de més amunt, aquesta funció ha de respondre així: .. literalinclude:: tests-propera.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més jocs de proves al fitxer :download:`tests-propera.txt`. Funció `nombre_de_transbordaments` (1.5 punts) ---------------------------------------------- Al mateix mòdul :py:mod:`metro4` (fitxer :file:`metro3.py`), implementeu-hi la funció següent: .. function:: nombre_de_transbordaments(g, p1, p2) :param ~networkx.Graph g: Graf que representa la xarxa de metro d'una ciutat :param str p1: Nom d'una parada de metro :param str p2: Nom d'una altra parada de metro :return: Nombre de transbordaments que cal fer per anar des de `p1` fins a `p2` seguint el trajecte més ràpid **en temps**. Si el camí més ràpid no és únic, retorna el nombre de transbordaments de qualsevol d'ells. Per exemple, si `g` és el graf de l'exemple de més amunt, aquesta funció ha de respondre així: .. literalinclude:: tests-transbordaments.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat .. admonition:: Suggeriment Es recomana fer servir les funcions de camins mínims de networkx (:py:mod:`networkx.algorithms.shortest_paths.generic`). Fixeu-vos en els diferents valors opcionals dels paràmetres de què disposen, en concret que poden tenir en compte el valor d'un atribut per a calcular la longitud dels camins. Disposeu de més jocs de proves al fitxer :download:`tests-transbordaments.txt`.