
    \Mh
                         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	dS )	zAttracting components.    N)not_implemented_for)number_attracting_componentsattracting_componentsis_attracting_component
undirectedc              #      K   t          t          j        |                     }t          j        | |          }|D ]%}|                    |          dk    r
||         V  &dS )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       i/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/algorithms/components/attracting.pyr   r      sp      J r/22
3
3C	C	 	 B  ==q  a&LLL     c                 N    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 V  dS )   N ).0acs     r   	<genexpr>z/number_attracting_components.<locals>.<genexpr>S   s"      44Rq444444r   )sumr   )r   s    r   r   r   9   s*    4 44033444444r   c                     t          t          |                     }t          |          dk    r&t          |d                   t          |           k    S dS )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   sI    4 
#A&&	'	'B
2ww!||2a5zzSVV##5r   )
__doc__networkxr
   networkx.utils.decoratorsr   __all___dispatchabler   r   r   r   r   r   <module>r#      s          9 9 9 9 9 9   \""' '  #"'T \""5 5  #"56 \""   #"  r   