Ë
    D^(h²  ã                   ó  — d Z ddlmZ ddlZddlmZ g d¢Z ed«      ej                  dd„«       «       Z	 ed«      ej                  dd„«       «       Z
 ed	«       ed«       ej                  d
¬«      dd„«       «       «       Zy)zBridge-finding algorithms.é    )ÚchainN)Únot_implemented_for)ÚbridgesÚhas_bridgesÚlocal_bridgesÚdirectedc              #   ó¸  K  — | j                  «       }|rt        j                  | «      n| }t        j                  ||¬«      }t	        t        j                  |«      «      }|�3|j                  t        j                  ||«      «      j                  «       }|j                  «       D ]0  \  }}||f|vsŒ||f|vsŒ|rt        | |   |   «      dkD  rŒ+||f–— Œ2 y­w)a@  Generate all bridges in a graph.

    A *bridge* in a graph is an edge whose removal causes the number of
    connected components of the graph to increase.  Equivalently, a bridge is an
    edge that does not belong to any cycle. Bridges are also known as cut-edges,
    isthmuses, or cut arcs.

    Parameters
    ----------
    G : undirected graph

    root : node (optional)
       A node in the graph `G`. If specified, only the bridges in the
       connected component containing this node will be returned.

    Yields
    ------
    e : edge
       An edge in the graph whose removal disconnects the graph (or
       causes the number of connected components to increase).

    Raises
    ------
    NodeNotFound
       If `root` is not in the graph `G`.

    NetworkXNotImplemented
        If `G` is a directed graph.

    Examples
    --------
    The barbell graph with parameter zero has a single bridge:

    >>> G = nx.barbell_graph(10, 0)
    >>> list(nx.bridges(G))
    [(9, 10)]

    Notes
    -----
    This is an implementation of the algorithm described in [1]_.  An edge is a
    bridge if and only if it is not contained in any chain. Chains are found
    using the :func:`networkx.chain_decomposition` function.

    The algorithm described in [1]_ requires a simple graph. If the provided
    graph is a multigraph, we convert it to a simple graph and verify that any
    bridges discovered by the chain decomposition algorithm are not multi-edges.

    Ignoring polylogarithmic factors, the worst-case time complexity is the
    same as the :func:`networkx.chain_decomposition` function,
    $O(m + n)$, where $n$ is the number of nodes in the graph and $m$ is
    the number of edges.

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Bridge_%28graph_theory%29#Bridge-Finding_with_Chain_Decompositions
    ©ÚrootNé   )Úis_multigraphÚnxÚGraphÚchain_decompositionÚsetr   Úfrom_iterableÚsubgraphÚnode_connected_componentÚcopyÚedgesÚlen)ÚGr   Ú
multigraphÚHÚchainsÚchain_edgesÚuÚvs           úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/bridges.pyr   r      sÉ   è ø€ ðv —‘Ó"€JÙ!Œ�‰�Œ q€AÜ×#Ñ# A¨DÔ1€FÜ”e×)Ñ)¨&Ó1Ó2€KØÐØ�J‰J”r×2Ñ2°1°dÓ;Ó<×AÑAÓCˆØ—‘“	ò ‰ˆˆ1Øˆqˆ6˜Ò$¨!¨Q¨°{Ò)BÙœc ! A¡$ q¡'›l¨QÒ.ØØ�Q�$‹Jñ	ùs   ‚B0CÂ3CÂ: Cc                 óP   — 	 t        t        | |¬«      «       y# t        $ r Y yw xY w)aà  Decide whether a graph has any bridges.

    A *bridge* in a graph is an edge whose removal causes the number of
    connected components of the graph to increase.

    Parameters
    ----------
    G : undirected graph

    root : node (optional)
       A node in the graph `G`. If specified, only the bridges in the
       connected component containing this node will be considered.

    Returns
    -------
    bool
       Whether the graph (or the connected component containing `root`)
       has any bridges.

    Raises
    ------
    NodeNotFound
       If `root` is not in the graph `G`.

    NetworkXNotImplemented
        If `G` is a directed graph.

    Examples
    --------
    The barbell graph with parameter zero has a single bridge::

        >>> G = nx.barbell_graph(10, 0)
        >>> nx.has_bridges(G)
        True

    On the other hand, the cycle graph has no bridges::

        >>> G = nx.cycle_graph(5)
        >>> nx.has_bridges(G)
        False

    Notes
    -----
    This implementation uses the :func:`networkx.bridges` function, so
    it shares its worst-case time complexity, $O(m + n)$, ignoring
    polylogarithmic factors, where $n$ is the number of nodes in the
    graph and $m$ is the number of edges.

    r
   TF)Únextr   ÚStopIteration)r   r   s     r   r   r   S   s0   € ðhÜŒW�Q˜TÔ"Ô#ð øô ò Ùðús   ‚ ™	%¤%r   Úweight)Ú
edge_attrsc              #   óÖ  ‡‡K  — |dur9| j                   D ])  \  }}t        | |   «      t        | |   «      z  rŒ$||f–— Œ+ yt        j                  j	                  | |«      Š| j                   D ]N  \  }}t        | |   «      t        | |   «      z  rŒ$||hŠˆˆfd„}	 t        j
                  | |||¬«      }|||f–— ŒP y# t        j                  $ r ||t        d«      f–— Y Œww xY w­w)al  Iterate over local bridges of `G` optionally computing the span

    A *local bridge* is an edge whose endpoints have no common neighbors.
    That is, the edge is not part of a triangle in the graph.

    The *span* of a *local bridge* is the shortest path length between
    the endpoints if the local bridge is removed.

    Parameters
    ----------
    G : undirected graph

    with_span : bool
        If True, yield a 3-tuple `(u, v, span)`

    weight : function, string or None (default: None)
        If function, used to compute edge weights for the span.
        If string, the edge data attribute used in calculating span.
        If None, all edges have weight 1.

    Yields
    ------
    e : edge
        The local bridges as an edge 2-tuple of nodes `(u, v)` or
        as a 3-tuple `(u, v, span)` when `with_span is True`.

    Raises
    ------
    NetworkXNotImplemented
        If `G` is a directed graph or multigraph.

    Examples
    --------
    A cycle graph has every edge a local bridge with span N-1.

       >>> G = nx.cycle_graph(9)
       >>> (0, 8, 8) in set(nx.local_bridges(G))
       True
    Tc                 ó*   •— | ‰vs|‰vr
 ‰| ||«      S y ©N© )ÚnÚnbrÚdÚenodesÚwts      €€r   Ú	hide_edgez local_bridges.<locals>.hide_edgeÄ   s"   ø€ Ø ‘¨#°VÑ*;Ù! ! S¨!›}Ð,Øó    )r#   ÚinfN)r   r   r   ÚweightedÚ_weight_functionÚshortest_path_lengthÚNetworkXNoPathÚfloat)	r   Ú	with_spanr#   r   r   r.   Úspanr,   r-   s	          @@r   r   r   �   sí   ùè ø€ ðV ˜ÑØ—G‘Gò 	‰DˆAˆqÜ˜˜!™“I¤ A a¡D£	Ó)Ø˜�d“
ñ	ô �[‰[×)Ñ)¨!¨VÓ4ˆØ—G‘Gò 	-‰DˆAˆqÜ˜˜!™“I¤ A a¡D£	Ó)Ø˜Q˜�õ ð
-Ü×2Ñ2°1°a¸À9ÔM�DØ˜Q ˜*Ó$ñ	-øô ×(Ñ(ò -Ø˜Q¤ e£Ð,Ô,ð-üs5   „4C)¹AC)Â
C)Â C Â=C)Ã #C&Ã#C)Ã%C&Ã&C)r'   )TN)Ú__doc__Ú	itertoolsr   Únetworkxr   Únetworkx.utilsr   Ú__all__Ú_dispatchabler   r   r   r(   r/   r   ú<module>r>      s£   ðÙ  å ã Ý .â
5€ñ �ZÓ Ø×ÑòCó ó !ðCñL �ZÓ Ø×Ñò7ó ó !ð7ñt �\Ó"Ù�ZÓ Ø€×Ñ˜XÔ&ò;-ó 'ó !ó #ñ;-r/   