
    Gd]                        d Z ddlZddlmZ ddlmZ g dZej         ed          d                         Z	d	 Z
ej         ed          d
                         Zej         ed          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                      }| D ]/}||vr)t          | |          }|                    |           |V  0d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
_plain_bfsupdate)Gseenvcs       Hlib/python3.11/site-packages/networkx/algorithms/components/connected.pyr   r      s\      ` 55D  D==1a  AKKNNNGGG	     c                 N    t          d t          |           D                       S )a  Returns the number of connected components.

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

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

    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>e   s"      33Rq333333r   )sumr   r   s    r   r   r   G   s*    < 33/22333333r   c           	          t          |           dk    rt          j        d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 zfor the null graph.c              3      K   | ]}d V  dS r   r   )r   nodes     r   r   zis_connected.<locals>.<genexpr>   s"      AATqAAAAAAr   )lennxNetworkXPointlessConceptr   r   r   r   s    r   r   r   h   sl    N 1vv{{)(*?
 
 	
 AAZ+<Q+?+?@@AAAAASVVKKr   c                 "    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   ns     r   r	   r	      s    L ar   c                     | j         }t                      }|h}|rK|}t                      }|D ]6}||vr0|                    |           |                    ||                    7|K|S )zA fast BFS node generator)adjr   addr   )r   sourceG_adjr   	nextlevel	thislevelr   s          r   r   r      s    EE55DI
 +	EE	 	+ 	+A}}  q***  + Kr   )__doc__networkxr#   networkx.utils.decoratorsr   utilsr   __all__	_dispatchr   r   r   r	   r   r   r   r   <module>r4      s         9 9 9 9 9 9 & & & & & &   Z  3 3 !  3l4 4 4B Z  )L )L !  )LX Z  $ $ !  $N    r   