K idZddlmZddlZddlmZgdZedejd dZ edejd dZ ed edejd dd Z y)zBridge-finding algorithms.)chainN)not_implemented_for)bridges has_bridges local_bridgesdirectedc#K|j}|rtj|n|}tj||}t t j |}|3|jtj||j}|jD]0\}}||f|vs ||f|vs|rt|||dkDr+||f2yw)a@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. Bridges are also known as cut-edges, isthmuses, or cut arcs. 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`. NetworkXNotImplemented If `G` is a directed graph. 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 if and only if it is not contained in any chain. Chains are found using the :func:`networkx.chain_decomposition` function. The algorithm described in [1]_ requires a simple graph. If the provided graph is a multigraph, we convert it to a simple graph and verify that any bridges discovered by the chain decomposition algorithm are not multi-edges. 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 rootN) is_multigraphnxGraphchain_decompositionsetr from_iterablesubgraphnode_connected_componentcopyedgeslen)Gr multigraphHchains chain_edgesuvs a/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/networkx/algorithms/bridges.pyrr sv"J! qA  # #AD 1Fe))&12K  JJr221d; < A A C 1 q6 $!Q{)Bc!A$q'lQ.Q$J sB0C3C: CcP tt||y#t$rYywxYw)aDecide 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`. NetworkXNotImplemented If `G` is a directed graph. 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. r TF)nextr StopIteration)rr s rrrSs0h WQT "# s  %%rweight) edge_attrsc#K|dur9|jD])\}}t||t||zr$||f+ytjj |||jD]N\}}t||t||zr$||hfd} tj ||||}|||fPy#tj $r||tdfYwwxYww)alIterate 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`. Raises ------ NetworkXNotImplemented If `G` is a directed graph or multigraph. 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 Tc*|vs|vr |||SyN)nnbrdenodeswts r hide_edgez local_bridges..hide_edges"#V*;!!S!},)r#infN)rrrweighted_weight_functionshortest_path_lengthNetworkXNoPathfloat) r with_spanr#rrr.spanr,r-s @@rrrsVGG DAq!IAaD )d  [[ ) )!V 4GG -DAq!IAaD )Q -221a9MDQ*$ -((-Qe ,,-s54C)AC) C) C=C)#C&#C)%C&&C)r')TN) __doc__ itertoolsrnetworkxrnetworkx.utilsr__all__ _dispatchablerrrr(r/rr>s . 5Z C!CLZ 7!7t\"Z X&;-'!#;-r/