Ë
    D^(hF%  ã                   óX  — d Z ddlZddlmZ g d¢Z ed«      ej                  d„ «       «       Z ed«      ej                  dd„«       «       Z ed«      ej                  d„ «       «       Z	 ed«      ej                  d	„ «       «       Z
 ed«       ej                  d
¬«      dd„«       «       Zy)zStrongly connected components.é    N)Únot_implemented_for)Ú$number_strongly_connected_componentsÚstrongly_connected_componentsÚis_strongly_connectedÚ&kosaraju_strongly_connected_componentsÚcondensationÚ
undirectedc              #   óÂ  K  — i }i }t        «       }g }d}| D �ci c]  }|t        | |   «      “Œ }}| D �]"  }||vsŒ	|g}	|	sŒ|	d   }||vr
|dz   }|||<   d}
||   D ]  }||vsŒ|	j                  |«       d}
 n |
rÖ||   ||<   | |   D ]?  }||vsŒ||   ||   kD  rt        ||   ||   g«      ||<   Œ*t        ||   ||   g«      ||<   ŒA |	j	                  «        ||   ||   k(  r[|h}|r@||d      ||   kD  r2|j	                  «       }|j                  |«       |r||d      ||   kD  rŒ2|j                  |«       |–— n|j                  |«       |	r�Œ�Œ% yc c}w ­w)a³  Generate nodes in strongly connected components of graph.

    Parameters
    ----------
    G : NetworkX Graph
        A directed graph.

    Returns
    -------
    comp : generator of sets
        A generator of sets of nodes, one for each strongly connected
        component of G.

    Raises
    ------
    NetworkXNotImplemented
        If G is undirected.

    Examples
    --------
    Generate a sorted list of strongly connected components, largest first.

    >>> G = nx.cycle_graph(4, create_using=nx.DiGraph())
    >>> nx.add_cycle(G, [10, 11, 12])
    >>> [
    ...     len(c)
    ...     for c in sorted(nx.strongly_connected_components(G), key=len, reverse=True)
    ... ]
    [4, 3]

    If you only want the largest component, it's more efficient to
    use max instead of sort.

    >>> largest = max(nx.strongly_connected_components(G), key=len)

    See Also
    --------
    connected_components
    weakly_connected_components
    kosaraju_strongly_connected_components

    Notes
    -----
    Uses Tarjan's algorithm[1]_ with Nuutila's modifications[2]_.
    Nonrecursive version of algorithm.

    References
    ----------
    .. [1] Depth-first search and linear graph algorithms, R. Tarjan
       SIAM Journal of Computing 1(2):146-160, (1972).

    .. [2] On finding the strongly connected components in a directed graph.
       E. Nuutila and E. Soisalon-Soinen
       Information Processing Letters 49(1): 9-14, (1994)..

    r   éÿÿÿÿé   TFN)ÚsetÚiterÚappendÚminÚpopÚaddÚupdate)ÚGÚpreorderÚlowlinkÚ	scc_foundÚ	scc_queueÚiÚvÚ	neighborsÚsourceÚqueueÚdoneÚwÚsccÚks                 úo/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/components/strongly_connected.pyr   r      sÄ  è ø€ ðv €HØ€GÜ“€IØ€IØ	€AØ()Ö* 1�”D˜˜1™“J‘Ð*€IÐ*Øó ,ˆØ˜Ò"Ø�HˆEÚØ˜"‘I�Ø˜HÑ$Ø˜A™�AØ"#�H˜Q‘KØ�Ø" 1™ò �AØ Ò(ØŸ™ QœØ$˜Ùð	ñ
 Ø!)¨!¡�G˜A‘JØ˜q™Tò L˜Ø IÒ-Ø'¨™{¨X°a©[Ò8Ü-0°'¸!±*¸gÀa¹jÐ1IÓ-J ¨¢
ä-0°'¸!±*¸hÀq¹kÐ1JÓ-K ¨¢
ðLð —I‘I”KØ˜q‘z X¨a¡[Ò0Ø ˜c˜Ù'¨H°Y¸r±]Ñ,CÀhÈqÁkÒ,QØ )§¡£˜AØŸG™G AœJñ (¨H°Y¸r±]Ñ,CÀhÈqÁkÓ,Qð "×(Ñ(¨Ô-Ø!›	à!×(Ñ(¨Ô+õ9 ñ,ùò +ùs3   ‚E™E¯E¼EÁ!EÁ$,EÂBEÄ+)EÅ	Ec              #   ó>  K  — t        t        j                  | j                  d¬«      |¬«      «      }t	        «       }|rX|j                  «       }||v rŒt        j                  | |«      }|D �ch c]	  }||vsŒ|’Œ }}|j                  |«       |–— |rŒWyyc c}w ­w)a	  Generate nodes in strongly connected components of graph.

    Parameters
    ----------
    G : NetworkX Graph
        A directed graph.

    Returns
    -------
    comp : generator of sets
        A generator of sets of nodes, one for each strongly connected
        component of G.

    Raises
    ------
    NetworkXNotImplemented
        If G is undirected.

    Examples
    --------
    Generate a sorted list of strongly connected components, largest first.

    >>> G = nx.cycle_graph(4, create_using=nx.DiGraph())
    >>> nx.add_cycle(G, [10, 11, 12])
    >>> [
    ...     len(c)
    ...     for c in sorted(
    ...         nx.kosaraju_strongly_connected_components(G), key=len, reverse=True
    ...     )
    ... ]
    [4, 3]

    If you only want the largest component, it's more efficient to
    use max instead of sort.

    >>> largest = max(nx.kosaraju_strongly_connected_components(G), key=len)

    See Also
    --------
    strongly_connected_components

    Notes
    -----
    Uses Kosaraju's algorithm.

    F)Úcopy)r   N)ÚlistÚnxÚdfs_postorder_nodesÚreverser   r   Údfs_preorder_nodesr   )r   r   ÚpostÚseenÚrÚcr   Únews           r"   r   r   r   s�   è ø€ ôb ”×&Ñ& q§y¡y°e yÓ'<ÀVÔLÓM€Dä‹5€DÙ
Ø�H‰H‹JˆØ�‰9ØÜ×!Ñ! ! QÓ'ˆØÖ-�Q˜q¨š}ŠqÐ-ˆÐ-Ø�‰�CÔØŠ	ô ùò
 .ùs   ‚A,BÁ.	BÁ8BÁ<BÂBc                 ó8   — t        d„ t        | «      D «       «      S )aµ  Returns number of strongly connected components in graph.

    Parameters
    ----------
    G : NetworkX graph
       A directed graph.

    Returns
    -------
    n : integer
       Number of strongly connected components

    Raises
    ------
    NetworkXNotImplemented
        If G is undirected.

    Examples
    --------
    >>> G = nx.DiGraph(
    ...     [(0, 1), (1, 2), (2, 0), (2, 3), (4, 5), (3, 4), (5, 6), (6, 3), (6, 7)]
    ... )
    >>> nx.number_strongly_connected_components(G)
    3

    See Also
    --------
    strongly_connected_components
    number_connected_components
    number_weakly_connected_components

    Notes
    -----
    For directed graphs only.
    c              3   ó    K  — | ]  }d –— Œ y­w)r   N© )Ú.0r    s     r"   ú	<genexpr>z7number_strongly_connected_components.<locals>.<genexpr>Ö   s   è ø€ Ò=�SŒqÑ=ùs   ‚)Úsumr   ©r   s    r"   r   r   °   s   € ôL Ñ=Ô9¸!Ó<Ô=Ó=Ð=ó    c                 óš   — t        | «      dk(  rt        j                  d«      ‚t        t        t	        | «      «      «      t        | «      k(  S )aW  Test directed graph for strong connectivity.

    A directed graph is strongly connected if and only if every vertex in
    the graph is reachable from every other vertex.

    Parameters
    ----------
    G : NetworkX Graph
       A directed graph.

    Returns
    -------
    connected : bool
      True if the graph is strongly connected, False otherwise.

    Examples
    --------
    >>> G = nx.DiGraph([(0, 1), (1, 2), (2, 3), (3, 0), (2, 4), (4, 2)])
    >>> nx.is_strongly_connected(G)
    True
    >>> G.remove_edge(2, 3)
    >>> nx.is_strongly_connected(G)
    False

    Raises
    ------
    NetworkXNotImplemented
        If G is undirected.

    See Also
    --------
    is_weakly_connected
    is_semiconnected
    is_connected
    is_biconnected
    strongly_connected_components

    Notes
    -----
    For directed graphs only.
    r   z-Connectivity is undefined for the null graph.)Úlenr&   ÚNetworkXPointlessConceptÚnextr   r5   s    r"   r   r   Ù   sG   € ôX ˆ1ƒv�‚{Ü×)Ñ)Ø?ó
ð 	
ô ŒtÔ1°!Ó4Ó5Ó6¼#¸a»&Ñ@Ð@r6   T)Úreturns_graphc                 óÆ  ‡‡— |€t        j                  | «      }i Ši }t        j                  «       }‰|j                  d<   t	        | «      dk(  r|S t        |«      D ]$  \  Š}||‰<   ‰j                  ˆfd„|D «       «       Œ& ‰dz   }|j                  t        |«      «       |j                  ˆfd„| j                  «       D «       «       t        j                  ||d«       |S )a�  Returns the condensation of G.

    The condensation of G is the graph with each of the strongly connected
    components contracted into a single node.

    Parameters
    ----------
    G : NetworkX DiGraph
       A directed graph.

    scc:  list or generator (optional, default=None)
       Strongly connected components. If provided, the elements in
       `scc` must partition the nodes in `G`. If not provided, it will be
       calculated as scc=nx.strongly_connected_components(G).

    Returns
    -------
    C : NetworkX DiGraph
       The condensation graph C of G.  The node labels are integers
       corresponding to the index of the component in the list of
       strongly connected components of G.  C has a graph attribute named
       'mapping' with a dictionary mapping the original nodes to the
       nodes in C to which they belong.  Each node in C also has a node
       attribute 'members' with the set of original nodes in G that
       form the SCC that the node in C represents.

    Raises
    ------
    NetworkXNotImplemented
        If G is undirected.

    Examples
    --------
    Contracting two sets of strongly connected nodes into two distinct SCC
    using the barbell graph.

    >>> G = nx.barbell_graph(4, 0)
    >>> G.remove_edge(3, 4)
    >>> G = nx.DiGraph(G)
    >>> H = nx.condensation(G)
    >>> H.nodes.data()
    NodeDataView({0: {'members': {0, 1, 2, 3}}, 1: {'members': {4, 5, 6, 7}}})
    >>> H.graph["mapping"]
    {0: 0, 1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1, 7: 1}

    Contracting a complete graph into one single SCC.

    >>> G = nx.complete_graph(7, create_using=nx.DiGraph)
    >>> H = nx.condensation(G)
    >>> H.nodes
    NodeView((0,))
    >>> H.nodes.data()
    NodeDataView({0: {'members': {0, 1, 2, 3, 4, 5, 6}}})

    Notes
    -----
    After contracting all strongly connected components to a single node,
    the resulting graph is a directed acyclic graph.

    Úmappingr   c              3   ó&   •K  — | ]  }|‰f–— Œ
 y ­w©Nr1   )r2   Únr   s     €r"   r3   zcondensation.<locals>.<genexpr>W  s   øè ø€ Ò1 !˜˜1”vÑ1ùs   ƒr   c              3   óP   •K  — | ]  \  }}‰|   ‰|   k7  sŒ‰|   ‰|   f–— Œ y ­wr?   r1   )r2   Úur   r=   s      €r"   r3   zcondensation.<locals>.<genexpr>Z  s7   øè ø€ ò Ù%) Q¨¸'À!¹*ÈÐPQÉ
Ó:Rˆ�‰�W˜Q‘ZÔ ñùs   ƒ&—&Úmembers)r&   r   ÚDiGraphÚgraphr8   Ú	enumerater   Úadd_nodes_fromÚrangeÚadd_edges_fromÚedgesÚset_node_attributes)r   r    rC   ÚCÚ	componentÚnumber_of_componentsr   r=   s         @@r"   r   r     sÚ   ù€ ð~ €{Ü×.Ñ.¨qÓ1ˆØ€GØ€GÜ
�
‰
‹€Aà €A‡G�GˆIÑÜ
ˆ1ƒv�‚{ØˆÜ! #›ò 2‰ˆˆ9Øˆ�‰
Ø�‰Ó1 yÔ1Õ1ð2ð ˜q™5ÐØ×Ñ”UÐ/Ó0Ô1Ø×Ñó Ø-.¯W©W«Yôô ô ×Ñ˜1˜g yÔ1Ø€Hr6   r?   )Ú__doc__Únetworkxr&   Únetworkx.utils.decoratorsr   Ú__all__Ú_dispatchabler   r   r   r   r   r1   r6   r"   ú<module>rT      sé   ðÙ $ã Ý 9ò€ñ �\Ó"Ø×Ññ^,ó ó #ð^,ñB �\Ó"Ø×Ñò9ó ó #ð9ñx �\Ó"Ø×Ññ$>ó ó #ð$>ñN �\Ó"Ø×Ññ/Aó ó #ð/Añd �\Ó"Ø€×Ñ Ô%òPó &ó #ñPr6   