
    \Mhw                     @   d Z ddlZddlm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 ed          ej        d                         Zd ZdS )zConnected components.    N)not_implemented_for   )arbitrary_element)number_connected_componentsconnected_componentsis_connectednode_connected_componentdirectedc              #      K   t                      }t          |           }| D ]@}||vr:t          | |t          |          z
  |          }|                    |           |V  AdS )a  Generate connected components.

    Parameters
    ----------
    G : NetworkX graph
       An undirected graph

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

    Raises
    ------
    NetworkXNotImplemented
        If G is directed.

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

    >>> G = nx.path_graph(4)
    >>> nx.add_path(G, [10, 11, 12])
    >>> [len(c) for c in sorted(nx.connected_components(G), key=len, reverse=True)]
    [4, 3]

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

    >>> largest_cc = max(nx.connected_components(G), key=len)

    To create the induced subgraph of each component use:

    >>> S = [G.subgraph(c).copy() for c in nx.connected_components(G)]

    See Also
    --------
    strongly_connected_components
    weakly_connected_components

    Notes
    -----
    For undirected graphs only.

    N)setlen
_plain_bfsupdate)Gseennvcs        h/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/algorithms/components/connected.pyr   r      ss      ` 55DAA  D==1a#d))mQ//AKKNNNGGG	     c                 N    t          d t          |           D                       S )aY  Returns the number of connected components.

    Parameters
    ----------
    G : NetworkX graph
       An undirected graph.

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

    Raises
    ------
    NetworkXNotImplemented
        If G is directed.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (1, 2), (5, 6), (3, 4)])
    >>> nx.number_connected_components(G)
    3

    See Also
    --------
    connected_components
    number_weakly_connected_components
    number_strongly_connected_components

    Notes
    -----
    For undirected graphs only.

    c              3      K   | ]}d V  dS    N ).0ccs     r   	<genexpr>z.number_connected_components.<locals>.<genexpr>n   s"      33Rq333333r   )sumr   )r   s    r   r   r   I   s+    J 33/22333333r   c           
          t          |           }|dk    rt          j        d          t          d t	          | |t          |                     D                       t          |           k    S )ag  Returns True if the graph is connected, False otherwise.

    Parameters
    ----------
    G : NetworkX Graph
       An undirected graph.

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

    Raises
    ------
    NetworkXNotImplemented
        If G is directed.

    Examples
    --------
    >>> G = nx.path_graph(4)
    >>> print(nx.is_connected(G))
    True

    See Also
    --------
    is_strongly_connected
    is_weakly_connected
    is_semiconnected
    is_biconnected
    connected_components

    Notes
    -----
    For undirected graphs only.

    r   z-Connectivity is undefined for the null graph.c              3      K   | ]}d V  dS r   r   )r   nodes     r   r   zis_connected.<locals>.<genexpr>   s"      DDTqDDDDDDr   )r   nxNetworkXPointlessConceptr   r   r   r   r   s     r   r   r   q   sp    N 	AAAvv);
 
 	
 DDZ1.?.B.BCCDDDDDANNr   c                 >    t          | t          |           |          S )a  Returns the set of nodes in the component of graph containing node n.

    Parameters
    ----------
    G : NetworkX Graph
       An undirected graph.

    n : node label
       A node in G

    Returns
    -------
    comp : set
       A set of nodes in the component of G containing node n.

    Raises
    ------
    NetworkXNotImplemented
        If G is directed.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (1, 2), (5, 6), (3, 4)])
    >>> nx.node_connected_component(G, 0)  # nodes of component that contains node 0
    {0, 1, 2}

    See Also
    --------
    connected_components

    Notes
    -----
    For undirected graphs only.

    )r   r   r%   s     r   r	   r	      s    L aQ###r   c                     | j         }|h}|g}|r[|}g }|D ]R}||         D ]0}||vr*|                    |           |                    |           1t          |          |k    r|c S S|[|S )zA fast BFS node generator)_adjaddappendr   )	r   r   sourceadjr   	nextlevel	thislevelr   ws	            r   r   r      s    
&C8DI
 			 	 	AV ( (D==HHQKKK$$Q'''4yyA~~   	 Kr   )__doc__networkxr#   networkx.utils.decoratorsr   utilsr   __all___dispatchabler   r   r   r	   r   r   r   r   <module>r6      s@         9 9 9 9 9 9 & & & & & &   Z  4 4  ! 4n Z  #4 #4  ! #4L Z  *O *O  ! *OZ Z  $$ $$  ! $$N    r   