
    ިsg
                     (    d Z ddlmZ  G d d      Zy)z
Union-find data structure.
    )groupsc                   0    e Zd ZdZddZd Zd Zd Zd Zy)		UnionFinda  Union-find data structure.

    Each unionFind instance X maintains a family of disjoint sets of
    hashable objects, supporting the following two methods:

    - X[item] returns a name for the set containing the given item.
      Each set is named by an arbitrarily-chosen one of its members; as
      long as the set remains unchanged it will keep the same name. If
      the item is not yet part of a set in X, a new singleton set is
      created for it.

    - X.union(item1, item2, ...) merges the sets containing each item
      into a single larger set.  If any item is not yet part of a set
      in X, it is added to X as one of the members of the merged set.

      Union-find data structure. Based on Josiah Carlson's code,
      https://code.activestate.com/recipes/215912/
      with significant additional changes by D. Eppstein.
      http://www.ics.uci.edu/~eppstein/PADS/UnionFind.py

    Nc                 r    |d}i | _         i | _        |D ]   }d| j                  |<   || j                   |<   " y)zCreate a new empty union-find structure.

        If *elements* is an iterable, this structure will be initialized
        with the discrete partition on the given set of elements.

        N    )parentsweights)selfelementsxs      L/var/www/html/venv/lib/python3.12/site-packages/networkx/utils/union_find.py__init__zUnionFind.__init__   sF     H 	 ADLLODLLO	     c                 
   || j                   vr || j                   |<   d| j                  |<   |S g }| j                   |   }||k7  r(|j                  |       |}| j                   |   }||k7  r(|D ]  }|| j                   |<    |S )z:Find and return the name of the set containing the object.r   )r	   r
   append)r   objectpathrootancestors        r   __getitem__zUnionFind.__getitem__.   s     %#)DLL #$DLL M ||F#fnKKF<<'D fn  	*H%)DLL"	*r   c                 ,    t        | j                        S )zBIterate through all items ever found or unioned by this structure.)iterr	   )r   s    r   __iter__zUnionFind.__iter__D   s    DLL!!r   c              #      K   | j                   D ]  }| |   }	 t        | j                         j                         E d{    y7 w)a]  Iterates over the sets stored in this structure.

        For example::

            >>> partition = UnionFind("xyz")
            >>> sorted(map(sorted, partition.to_sets()))
            [['x'], ['y'], ['z']]
            >>> partition.union("x", "y")
            >>> sorted(map(sorted, partition.to_sets()))
            [['x', 'y'], ['z']]

        N)r	   r   values)r   r   _s      r   to_setszUnionFind.to_setsH   sA       	AQA	 $,,'..000s   =AA Ac           	          t        t        |D ch c]  } |   	 c} fdd            }	 t        |      }|D ]5  } j                  |xx    j                  |   z  cc<   | j
                  |<   7 yc c}w # t        $ r Y yw xY w)z8Find the sets containing the objects and merge them all.c                 "    j                   |    S N)r
   )rr   s    r   <lambda>z!UnionFind.union.<locals>.<lambda>`   s    $,,q/ r   T)keyreverseN)r   sortednextStopIterationr
   r	   )r   objectsr   rootsr   r"   s   `     r   unionzUnionFind.union[   s     ")*Qa*0ISW

	;D  	#ALL$,,q/1"DLLO	# +
  		s   A4A9 9	BBr!   )	__name__
__module____qualname____doc__r   r   r   r   r+   r   r   r   r   r      s     , ,"1&#r   r   N)r/   networkx.utilsr   r   r   r   r   <module>r1      s    "b# b#r   