================================= Grafs: Sistema fluvial (4 Punts) ================================= .. py:module:: rius :noindex: .. figure:: concaAmazones.png :align: right :height: 400 Representarem un sistema fluvial, és a dir, un conjunt de rius més els seus afluents, com un graf dirigit de networkx (un :py:class:`~networkx.DiGraph`). En aquest graf, els nodes són els noms dels rius i una aresta indica que un riu és afluent d'un altre. La direcció de l'aresta va de l'afluent, que és més petit, al riu al qual desemboca, que és més gran, tal com es mostra al dibuix. Un riu que aporta les seves aigües, directa o indirectament, a les d'un altre se l'anomena **tributari**. Per exemple, els rius Jari, Juruena, i Arinos són tributaris de l'Amazones. .. figure:: rius.svg :align: center :height: 300 En el següent exemple, el graf `gr` representa una petita part del sistema fluvial dels rius Amazones i Orinoco, el que està dibuixat més amunt: .. literalinclude:: tests-cabals.txt :language: python :end-before: --fi-creacio Funció afegeix_cabals --------------------- Al mòdul :py:mod:`rius` (fitxer :file:`rius.py`), implementeu-hi la funció **modificadora** següent: .. function:: afegeix_cabals(gr, dc) :param gr: graf de NetworkX que representa un sistema fluvial. :param dc: diccionari, on les claus són noms de rius i els valors són el cabal anual promig del riu, en :math:`m^3/s`. Modifica `gr` assignant als rius els cabals associats als noms de `dc` com un atribut de node anomenat :py:const:`'cabal'`. Si algun dels noms de `dc` no és un riu de `gr`, no se li assigna el cabal. Per exemple, si `gr` és el graf de més amunt sense cap cabal assignat, aquesta funció ha de respondre així: .. literalinclude:: tests-cabals.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més jocs de proves al fitxer :download:`tests-cabals.txt`. Funció max_tributaris --------------------- Al mateix mòdul :py:mod:`rius` (fitxer :file:`rius.py`), implementeu-hi la funció següent: .. function:: max_tributaris(gr, nriu) :param gr: graf de NetworkX que representa un sistema fluvial. :param nriu: nom d'un riu. :return: nom de l'afluent de `nriu` que té més rius tributaris. Si hi ha dos o més afluents de `nriu` que tenen el mateix nombre de tributaris, retorna el nom de qualsevol d'ells. En el cas que `nriu` no tingui afluents, retorna l'string buit. Per exemple, si `gr` és el graf de més amunt, aquesta funció ha de respondre així: .. literalinclude:: tests-tributaris.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat .. note:: Per a resoldre aquest apartat resulta útil fer servir la funció :py:func:`~networkx.algorithms.dag.ancestors`. Disposeu de més jocs de proves al fitxer :download:`tests-tributaris.txt`.