ó žÃÒYc@s´dZddlmZddlZddlmZdddgZedƒed ƒdd „ƒƒZ edƒed ƒdd „ƒƒZ edƒed ƒe dd „ƒƒZ dS( sBridge-finding algorithms.iÿÿÿÿ(tchainN(tnot_implemented_fortbridgest has_bridgest local_bridgest multigraphtdirectedccs}tj|d|ƒ}ttj|ƒƒ}xL|jƒD]>\}}||f|kr7||f|kr7||fVq7q7WdS(sÆGenerate all bridges in a graph. A *bridge* in a graph is an edge whose removal causes the number of connected components of the graph to increase. Equivalently, a bridge is an edge that does not belong to any cycle. Parameters ---------- G : undirected graph root : node (optional) A node in the graph `G`. If specified, only the bridges in the connected component containing this node will be returned. Yields ------ e : edge An edge in the graph whose removal disconnects the graph (or causes the number of connected components to increase). Raises ------ NodeNotFound If `root` is not in the graph `G`. Examples -------- The barbell graph with parameter zero has a single bridge: >>> G = nx.barbell_graph(10, 0) >>> list(nx.bridges(G)) [(9, 10)] Notes ----- This is an implementation of the algorithm described in _[1]. An edge is a bridge iff it is not contained in any chain. Chains are found using the :func:`networkx.chain_decomposition` function. Ignoring polylogarithmic factors, the worst-case time complexity is the same as the :func:`networkx.chain_decomposition` function, $O(m + n)$, where $n$ is the number of nodes in the graph and $m$ is the number of edges. References ---------- .. [1] https://en.wikipedia.org/wiki/Bridge_%28graph_theory%29#Bridge-Finding_with_Chain_Decompositions trootN(tnxtchain_decompositiontsetRt from_iterabletedges(tGRtchainst chain_edgestutv((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bridges.pyRs 3$cCs1ytt|ƒƒWntk r(tSXtSdS(s Decide whether a graph has any bridges. A *bridge* in a graph is an edge whose removal causes the number of connected components of the graph to increase. Parameters ---------- G : undirected graph root : node (optional) A node in the graph `G`. If specified, only the bridges in the connected component containing this node will be considered. Returns ------- bool Whether the graph (or the connected component containing `root`) has any bridges. Raises ------ NodeNotFound If `root` is not in the graph `G`. Examples -------- The barbell graph with parameter zero has a single bridge:: >>> G = nx.barbell_graph(10, 0) >>> nx.has_bridges(G) True On the other hand, the cycle graph has no bridges:: >>> G = nx.cycle_graph(5) >>> nx.has_bridges(G) False Notes ----- This implementation uses the :func:`networkx.bridges` function, so it shares its worst-case time complexity, $O(m + n)$, ignoring polylogarithmic factors, where $n$ is the number of nodes in the graph and $m$ is the number of edges. N(tnextRt StopIterationtFalsetTrue(R R((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bridges.pyRMs 1 c#s|tk rUx |jD]8\}}t||ƒt||ƒ@s||fVqqWnÆtjj||ƒ‰x®|jD]£\}}t||ƒt||ƒ@st||h‰‡‡fd†}y-tj|||d|ƒ}|||fVWqtjk r||tdƒfVqXqtqtWdS(sIterate over local bridges of `G` optionally computing the span A *local bridge* is an edge whose endpoints have no common neighbors. That is, the edge is not part of a triangle in the graph. The *span* of a *local bridge* is the shortest path length between the endpoints if the local bridge is removed. Parameters ---------- G : undirected graph with_span : bool If True, yield a 3-tuple `(u, v, span)` weight : function, string or None (default: None) If function, used to compute edge weights for the span. If string, the edge data attribute used in calculating span. If None, all edges have weight 1. Yields ------ e : edge The local bridges as an edge 2-tuple of nodes `(u, v)` or as a 3-tuple `(u, v, span)` when `with_span is True`. Examples -------- A cycle graph has every edge a local bridge with span N-1. >>> G = nx.cycle_graph(9) >>> (0, 8, 8) in set(nx.local_bridges(G)) True cs,|ˆks|ˆkr(ˆ|||ƒSdS(N(tNone(tntnbrtd(tenodestwt(sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bridges.pyt hide_edgeµstweighttinfN( RR R Rtweightedt_weight_functiontshortest_path_lengthtNetworkXNoPathtfloat(R t with_spanRRRRtspan((RRsq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bridges.pyR†s%  ( t__doc__t itertoolsRtnetworkxRtnetworkx.utilsRt__all__RRRRR(((sq/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bridges.pyt s   8  7