o
    ˷e/                     @   sB   d Z ddlmZ ddlmZ ddgZeddd	dZd
d ZdS )a  Functions for finding node and edge dominating sets.

A `dominating set`_ for an undirected graph *G* with vertex set *V*
and edge set *E* is a subset *D* of *V* such that every vertex not in
*D* is adjacent to at least one member of *D*. An `edge dominating set`_
is a subset *F* of *E* such that every edge not in *F* is
incident to an endpoint of at least one edge in *F*.

.. _dominating set: https://en.wikipedia.org/wiki/Dominating_set
.. _edge dominating set: https://en.wikipedia.org/wiki/Edge_dominating_set

   )not_implemented_for   )maximal_matchingmin_weighted_dominating_setmin_edge_dominating_setdirectedNc                    sz   t  dkr	t S t  fdd}t } fdd D }|r;t| |d\}}| ||= ||8 }|s#S )a[  Returns a dominating set that approximates the minimum weight node
    dominating set.

    Parameters
    ----------
    G : NetworkX graph
        Undirected graph.

    weight : string
        The node attribute storing the weight of an node. If provided,
        the node attribute with this key must be a number for each
        node. If not provided, each node is assumed to have weight one.

    Returns
    -------
    min_weight_dominating_set : set
        A set of nodes, the sum of whose weights is no more than `(\log
        w(V)) w(V^*)`, where `w(V)` denotes the sum of the weights of
        each node in the graph and `w(V^*)` denotes the sum of the
        weights of each node in the minimum weight dominating set.

    Notes
    -----
    This algorithm computes an approximate minimum weighted dominating
    set for the graph `G`. The returned solution has weight `(\log
    w(V)) w(V^*)`, where `w(V)` denotes the sum of the weights of each
    node in the graph and `w(V^*)` denotes the sum of the weights of
    each node in the minimum weight dominating set for the graph.

    This implementation of the algorithm runs in $O(m)$ time, where $m$
    is the number of edges in the graph.

    References
    ----------
    .. [1] Vazirani, Vijay V.
           *Approximation Algorithms*.
           Springer Science & Business Media, 2001.

        c                    s&   | \}} j | dt|  S )zReturns the cost-effectiveness of greedily choosing the given
        node.

        `node_and_neighborhood` is a two-tuple comprising a node and its
        closed neighborhood.

           )nodesgetlen)node_and_neighborhoodvneighborhoodGdom_setweight g/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/approximation/dominating_set.py_costE   s   z*min_weighted_dominating_set.<locals>._costc                    s    i | ]}||ht  | B qS r   )set).0r   r   r   r   
<dictcomp>U   s     z/min_weighted_dominating_set.<locals>.<dictcomp>)key)r   r   minitemsadd)r   r   r   verticesneighborhoodsdom_nodemin_setr   r   r   r      s   *

c                 C   s   | st dt| S )a  Returns minimum cardinality edge dominating set.

    Parameters
    ----------
    G : NetworkX graph
      Undirected graph

    Returns
    -------
    min_edge_dominating_set : set
      Returns a set of dominating edges whose size is no more than 2 * OPT.

    Notes
    -----
    The algorithm computes an approximate solution to the edge dominating set
    problem. The result is no more than 2 * OPT in terms of size of the set.
    Runtime of the algorithm is $O(|E|)$.
    z"Expected non-empty NetworkX graph!)
ValueErrorr   r   r   r   r   r   f   s   )N)__doc__utilsr   matchingr   __all__r   r   r   r   r   r   <module>   s    P