a
    ‘Àh…  ã                   @   s:   d Z ddlZddlmZ dgZedƒedƒdd„ ƒƒZdS )z  Provides a function for computing the extendability of a graph which is
undirected, simple, connected and bipartite and contains at least one perfect matching.é    N)Únot_implemented_forÚmaximal_extendabilityZdirectedZ
multigraphc              	      s
  t  | ¡st  d¡‚t j | ¡s*t  d¡‚t j | ¡\‰ ‰t j | ¡‰t  | ˆ¡s\t  d¡‚‡fdd„ˆˆ ¡ @ D ƒ‰‡ ‡‡fdd„| j	D ƒ}t  
¡ }| | ¡ | |¡ t  |¡s¾t  d¡‚tdƒ}ˆ D ]:}ˆD ]0}td	d
„ t  |||¡D ƒƒ}||k rþ|n|}qÒqÊ|S )ux  Computes the extendability of a graph.

    The extendability of a graph is defined as the maximum $k$ for which `G`
    is $k$-extendable. Graph `G` is $k$-extendable if and only if `G` has a
    perfect matching and every set of $k$ independent edges can be extended
    to a perfect matching in `G`.

    Parameters
    ----------
    G : NetworkX Graph
        A fully-connected bipartite graph without self-loops

    Returns
    -------
    extendability : int

    Raises
    ------
    NetworkXError
       If the graph `G` is disconnected.
       If the graph `G` is not bipartite.
       If the graph `G` does not contain a perfect matching.
       If the residual graph of `G` is not strongly connected.

    Notes
    -----
    Definition:
    Let `G` be a simple, connected, undirected and bipartite graph with a perfect
    matching M and bipartition (U,V). The residual graph of `G`, denoted by $G_M$,
    is the graph obtained from G by directing the edges of M from V to U and the
    edges that do not belong to M from U to V.

    Lemma [1]_ :
    Let M be a perfect matching of `G`. `G` is $k$-extendable if and only if its residual
    graph $G_M$ is strongly connected and there are $k$ vertex-disjoint directed
    paths between every vertex of U and every vertex of V.

    Assuming that input graph `G` is undirected, simple, connected, bipartite and contains
    a perfect matching M, this function constructs the residual graph $G_M$ of G and
    returns the minimum value among the maximum vertex-disjoint directed paths between
    every vertex of U and every vertex of V in $G_M$. By combining the definitions
    and the lemma, this value represents the extendability of the graph `G`.

    Time complexity O($n^3$ $m^2$)) where $n$ is the number of vertices
    and $m$ is the number of edges.

    References
    ----------
    .. [1] "A polynomial algorithm for the extendability problem in bipartite graphs",
          J. Lakhal, L. Litzler, Information Processing Letters, 1998.
    .. [2] "On n-extendible graphs", M. D. Plummer, Discrete Mathematics, 31:201â€“210, 1980
          https://doi.org/10.1016/0012-365X(80)90037-0

    zGraph G is not connectedzGraph G is not bipartitez+Graph G does not contain a perfect matchingc                    s   g | ]}|ˆ | f‘qS © r   )Ú.0Únode)Úmaximum_matchingr   úg/var/www/html/assistant/venv/lib/python3.9/site-packages/networkx/algorithms/bipartite/extendability.pyÚ
<listcomp>R   ó    z)maximal_extendability.<locals>.<listcomp>c                    sH   g | ]@\}}|ˆv r ||fˆv s4|ˆ v r<||fˆvr<||fn||f‘qS r   r   )r   ÚxÚy)ÚUÚVÚpmr   r   r	   U   s   ÿz1The residual graph of G is not strongly connectedZInfc                 s   s   | ]
}d V  qdS )é   Nr   )r   Ú_r   r   r   Ú	<genexpr>g   r
   z(maximal_extendability.<locals>.<genexpr>)ÚnxZis_connectedZNetworkXErrorZ	bipartiteZis_bipartiteZsetsZhopcroft_karp_matchingZis_perfect_matchingÚkeysÚedgesZDiGraphZadd_nodes_fromZadd_edges_fromZis_strongly_connectedÚfloatÚsumZnode_disjoint_paths)ÚGZdirected_edgesZ
residual_GÚkÚuÚvZ	num_pathsr   )r   r   r   r   r   r      s.    9



þ



)Ú__doc__Znetworkxr   Znetworkx.utilsr   Ú__all__r   r   r   r   r   Ú<module>   s   