
    h
                         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               Z ed      ej                  d               Z	y)	zAttracting components.    N)not_implemented_for)number_attracting_componentsattracting_componentsis_attracting_component
undirectedc              #      K   t        t        j                  |             }t        j                  | |      }|D ]  }|j	                  |      dk(  s||      yw)a  Generates the attracting components in `G`.

    An attracting component in a directed graph `G` is a strongly connected
    component with the property that a random walker on the graph will never
    leave the component, once it enters the component.

    The nodes in attracting components can also be thought of as recurrent
    nodes.  If a random walker enters the attractor containing the node, then
    the node will be visited infinitely often.

    To obtain induced subgraphs on each component use:
    ``(G.subgraph(c).copy() for c in attracting_components(G))``

    Parameters
    ----------
    G : DiGraph, MultiDiGraph
        The graph to be analyzed.

    Returns
    -------
    attractors : generator of sets
        A generator of sets of nodes, one for each attracting component of G.

    Raises
    ------
    NetworkXNotImplemented
        If the input graph is undirected.

    See Also
    --------
    number_attracting_components
    is_attracting_component

    r   N)listnxstrongly_connected_componentscondensation
out_degree)GscccGns       f/var/www/django_project/virt/lib/python3.12/site-packages/networkx/algorithms/components/attracting.pyr   r      sW     J r//2
3C	C	 B ==q a&Ls   AA
Ac                 8    t        d t        |       D              S )a  Returns the number of attracting components in `G`.

    Parameters
    ----------
    G : DiGraph, MultiDiGraph
        The graph to be analyzed.

    Returns
    -------
    n : int
        The number of attracting components in G.

    Raises
    ------
    NetworkXNotImplemented
        If the input graph is undirected.

    See Also
    --------
    attracting_components
    is_attracting_component

    c              3       K   | ]  }d   yw)   N ).0acs     r   	<genexpr>z/number_attracting_components.<locals>.<genexpr>S   s     4Rq4s   )sumr   )r   s    r   r   r   9   s    4 403444    c                 |    t        t        |             }t        |      dk(  rt        |d         t        |       k(  S y)a  Returns True if `G` consists of a single attracting component.

    Parameters
    ----------
    G : DiGraph, MultiDiGraph
        The graph to be analyzed.

    Returns
    -------
    attracting : bool
        True if `G` has a single attracting component. Otherwise, False.

    Raises
    ------
    NetworkXNotImplemented
        If the input graph is undirected.

    See Also
    --------
    attracting_components
    number_attracting_components

    r   r   F)r	   r   len)r   r   s     r   r   r   V   s9    4 
#A&	'B
2w!|2a5zSV##r   )
__doc__networkxr
   networkx.utils.decoratorsr   __all___dispatchabler   r   r   r   r   r   <module>r#      s      9 \"'  #'T \"5  #56 \"  #r   