
    h                     `    S r SSKJr  SSKJr  SSKrSSKJr  SS/r	SS	 jr
SS
 jrSS jrS rg)zB
Cuthill-McKee ordering of graph nodes to produce sparse matrices
    )deque)
itemgetterN   )arbitrary_elementcuthill_mckee_orderingreverse_cuthill_mckee_orderingc              #      #    [         R                  " U 5       H&  n[        U R                  U5      U5       Sh  vN   M(     g N	7f)aA  Generate an ordering (permutation) of the graph nodes to make
a sparse matrix.

Uses the Cuthill-McKee heuristic (based on breadth-first search) [1]_.

Parameters
----------
G : graph
  A NetworkX graph

heuristic : function, optional
  Function to choose starting node for RCM algorithm.  If None
  a node from a pseudo-peripheral pair is used.  A user-defined function
  can be supplied that takes a graph object and returns a single node.

Returns
-------
nodes : generator
   Generator of nodes in Cuthill-McKee ordering.

Examples
--------
>>> from networkx.utils import cuthill_mckee_ordering
>>> G = nx.path_graph(4)
>>> rcm = list(cuthill_mckee_ordering(G))
>>> A = nx.adjacency_matrix(G, nodelist=rcm)

Smallest degree node as heuristic function:

>>> def smallest_degree(G):
...     return min(G, key=G.degree)
>>> rcm = list(cuthill_mckee_ordering(G, heuristic=smallest_degree))


See Also
--------
reverse_cuthill_mckee_ordering

Notes
-----
The optimal solution the bandwidth reduction is NP-complete [2]_.


References
----------
.. [1] E. Cuthill and J. McKee.
   Reducing the bandwidth of sparse symmetric matrices,
   In Proc. 24th Nat. Conf. ACM, pages 157-172, 1969.
   http://doi.acm.org/10.1145/800195.805928
.. [2]  Steven S. Skiena. 1997. The Algorithm Design Manual.
   Springer-Verlag New York, Inc., New York, NY, USA.
N)nxconnected_components connected_cuthill_mckee_orderingsubgraph)G	heuristiccs      D/var/www/html/env/lib/python3.13/site-packages/networkx/utils/rcm.pyr   r      s8     j $$Q'3AJJqM9MMM (Ms   8AA
Ac           	      8    [        [        [        XS95      5      $ )a_  Generate an ordering (permutation) of the graph nodes to make
a sparse matrix.

Uses the reverse Cuthill-McKee heuristic (based on breadth-first search)
[1]_.

Parameters
----------
G : graph
  A NetworkX graph

heuristic : function, optional
  Function to choose starting node for RCM algorithm.  If None
  a node from a pseudo-peripheral pair is used.  A user-defined function
  can be supplied that takes a graph object and returns a single node.

Returns
-------
nodes : generator
   Generator of nodes in reverse Cuthill-McKee ordering.

Examples
--------
>>> from networkx.utils import reverse_cuthill_mckee_ordering
>>> G = nx.path_graph(4)
>>> rcm = list(reverse_cuthill_mckee_ordering(G))
>>> A = nx.adjacency_matrix(G, nodelist=rcm)

Smallest degree node as heuristic function:

>>> def smallest_degree(G):
...     return min(G, key=G.degree)
>>> rcm = list(reverse_cuthill_mckee_ordering(G, heuristic=smallest_degree))


See Also
--------
cuthill_mckee_ordering

Notes
-----
The optimal solution the bandwidth reduction is NP-complete [2]_.

References
----------
.. [1] E. Cuthill and J. McKee.
   Reducing the bandwidth of sparse symmetric matrices,
   In Proc. 24th Nat. Conf. ACM, pages 157-72, 1969.
   http://doi.acm.org/10.1145/800195.805928
.. [2]  Steven S. Skiena. 1997. The Algorithm Design Manual.
   Springer-Verlag New York, Inc., New York, NY, USA.
)r   )reversedlistr   )r   r   s     r   r   r   H   s    j D/GHII    c              #   ~  #    Uc  [        U 5      nOU" U 5      nU1n[        U/5      nU(       a  UR                  5       nUv   [        U R	                  [        X   5      U-
  5      [        S5      S9nU VVs/ s H  u  pxUPM	     n	nnUR                  U	5        UR                  U	5        U(       a  M  g g s  snnf 7f)N   key)	pseudo_peripheral_noder   popleftsorteddegreesetr   updateextend)
r   r   startvisitedqueueparentndndchildrens
             r   r   r      s     &q)!gG5'NE
AHHS^g56JqMJ"$%"$!A"%x X % &s   A7B=9B7,B=5B=c                 *  ^ [        U 5      nSnUn [        [        R                  " X5      5      n[	        UR                  5       5      mTU::  a   U$ TnU4S jUR                  5        5       n[        U R                  U5      [        S5      S9u  p6M  )Nr   c              3   <   >#    U  H  u  pUT:X  d  M  Uv   M     g 7fN ).0r&   distls      r   	<genexpr>)pseudo_peripheral_node.<locals>.<genexpr>   s     >['!DAIAA[s   	r   r   )
r   dictr
   shortest_path_lengthmaxvaluesitemsminr   r   )r   ulpvsplfarthestdegr/   s          @r   r   r      s     	!A	
B	A
2**101

7 H >SYY[>QXXh'Z]; r   r+   )__doc__collectionsr   operatorr   networkxr
   utilsr   __all__r   r   r   r   r,   r   r   <module>rD      s;       %#%E
F6Nr5Jp"r   