ó žÃÒYc@s›dZddlmZddlmZddlZddlmZddl m Z m Z m Z e Z djd gƒZd gZddd „Zd „ZdS( s0 Kanevsky all minimum node k cutsets algorithm. iÿÿÿÿ(t itemgetter(t combinationsNi(t!build_auxiliary_node_connectivity(tbuild_residual_networkt edmonds_karptshortest_augmenting_paths s%Jordi Torrents t all_node_cutsc#sjtj|ƒs!tjdƒ‚n|jƒ|jƒkrØtd„|jƒDƒƒrØtƒ}xp|D]h‰x_tj|ˆƒD]K}ˆ|f|kr~|ˆf|kr~|ˆhV|j |ˆfƒq~q~WqeWdSntj |ƒdkr x,t |t |ƒdƒD]}t|ƒVqWdSg}t |ƒ‰ˆjd}tˆdƒ}tddd|ƒ}|dkrxt}n|tkr‘t|d>> # A two-dimensional grid graph has 4 cutsets of cardinality 2 >>> G = nx.grid_2d_graph(5, 5) >>> cutsets = list(nx.all_node_cuts(G)) >>> len(cutsets) 4 >>> all(2 == len(cutset) for cutset in cutsets) True >>> nx.node_connectivity(G) 2 Notes ----- This implementation is based on the sequential algorithm for finding all minimum-size separating vertex sets in a graph [1]_. The main idea is to compute minimum cuts using local maximum flow computations among a set of nodes of highest degree and all other non-adjacent nodes in the Graph. Once we find a minimum cut, we add an edge between the high degree node and the target node of the local maximum flow computation to make sure that we will not find that minimum cut again. See also -------- node_connectivity edmonds_karp shortest_augmenting_path References ---------- .. [1] Kanevsky, A. (1993). Finding all minimum-size separating vertex sets in a graph. Networks 23(6), 533--541. http://onlinelibrary.wiley.com/doi/10.1002/net.3230230604/abstract sInput graph is disconnected.css!|]\}}d|kVqdS(iN((t.0tntd((s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pys ]sNitmappingtcapacitytresidualt two_phaset flow_funccSsh|]\}}|’qS(((RRR ((s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pys ~s tkeytreverses%sBs%sAt flow_valuetdatatflowcs(h|]\}}|ˆkr|’qS(((RRtscc(t antichain(s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pys žs c3s'|]}|ˆkrˆ|fVqdS(N((Rtw(tStu(s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pys ¢scs.h|]$}|D]}ˆj|d’qqS(tid(tnodes(RtedgeR(tH(s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pys ¥s ("tnxt is_connectedt NetworkXErrortordertsizetalltdegreetsett non_neighborstaddtdensityRtlenRtgraphRtdicttNonetdefault_flow_funcRtTruetnode_connectivitytsortedRt_is_separating_settappendtedgestremove_edges_fromt condensationt antichainstitemstupdatetadd_edgetadd_edges_from(tGtkRtseentvtcut_setR tRtkwargstXtxt non_adjacentRRR tsaturated_edgestLtcmaptcutsettnode_cut((RRRRs/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pyRs|A  $         2   %  )    ( cCsLt|ƒt|ƒdkr tStj||gƒ}tj|ƒrHtStS(s)Assumes that the input graph is connectedi(R(R-Rtrestricted_viewRtFalse(R:tcutR((s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pyR0¾s (t__doc__toperatorRt itertoolsRtnetworkxRtutilsRtnetworkx.algorithms.flowRRRR,tjoint __author__t__all__R+RR0(((s/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/connectivity/kcutsets.pyts  ¨