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). .. hint:: 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:: metro3 Funció `assignar_temps` (2 punts) --------------------------------- Al mòdul :py:mod:`metro3` (fitxer :file:`metro3.py`), implementeu-hi la funció següent: .. function:: assignar_temps(g, noml, segons) :param networkx.Graph g: Graf que representa la xarxa de metro d'una ciutat :param str noml: Nom d'una línia de metro de `g` :param int segons: Temps que es triga entre les estacions de la línia, en segons Modifica el graf `g` assignant a **totes** les arestes de la línia de metro de nom `noml` el valor `segons` a l'etiqueta :py:const:`'temps'` Per exemple, si `g` és el graf de l'exemple de més amunt, aquesta funció ha de respondre així: .. literalinclude:: tests-temps.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més jocs de proves al fitxer :download:`tests-temps.txt`. Funció `parada_mes_llunyana` (1.5 punts) ---------------------------------------- Donada una parada de metro, volem saber quina és la parada de metro més apartada en temps d'ella, és a dir, aquella altra parada a la qual trigarem més a arribar prenent el camí més ràpid possible. Al mateix mòdul :py:mod:`metro3` (fitxer :file:`metro3.py`), implementeu-hi la funció següent: .. function:: parada_mes_llunyana(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 apartada de `np` i quants segons es triga a arribar-hi (en el millor dels casos). Si hi hagués dues o més parades igualment apartades, 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-llunyana.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat .. hint:: Es recomana fer servir la funció :py:func:`~networkx.algorithms.shortest_paths.generic.shortest_path_length`. Fixeu-vos en els diferents valors opcionals dels paràmetres de què disposa, en concret que pot 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-llunyana.txt`.