ó žÃÒYc@sªdZddlZddlmZdddddd d gZddd „Zddd „Zddd „Z ddd„Z ddd„Z ddd„Z ddd„Z dS(s@Basic algorithms for depth-first searching the nodes of a graph.iÿÿÿÿN(t defaultdictt dfs_edgestdfs_treetdfs_predecessorstdfs_successorstdfs_preorder_nodestdfs_postorder_nodestdfs_labeled_edgesc cs:|dkr|}n |g}tƒ}|dkrBt|ƒ}nxñ|D]é}||kraqIn|j|ƒ||t||ƒfg}x¥|r1|d\}}} yjt| ƒ} | |kr|| fV|j| ƒ|dkr|j| |dt|| ƒfƒqnWqtk r-|jƒqXqWqIWdS(sòIterate over edges in a depth-first-search (DFS). Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- edges: generator A generator of edges in the depth-first-search. Examples -------- >>> G = nx.path_graph(5) >>> list(nx.dfs_edges(G, source=0)) [(0, 1), (1, 2), (2, 3), (3, 4)] >>> list(nx.dfs_edges(G, source=0, depth_limit=2)) [(0, 1), (1, 2)] Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search See Also -------- dfs_preorder_nodes dfs_postorder_nodes dfs_labeled_edges iÿÿÿÿiN( tNonetsettlentaddtitertnexttappendt StopIterationtpop( tGtsourcet depth_limittnodestvisitedtstarttstacktparentt depth_nowtchildrentchild((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyRs,.              . cCsRtjƒ}|dkr(|j|ƒn |j|ƒ|jt|||ƒƒ|S(suReturn oriented tree constructed from a depth-first-search from source. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- T : NetworkX DiGraph An oriented tree Examples -------- >>> G = nx.path_graph(5) >>> T = nx.dfs_tree(G, source=0, depth_limit=2) >>> list(T.edges()) [(0, 1), (1, 2)] >>> T = nx.dfs_tree(G, source=0) >>> list(T.edges()) [(0, 1), (1, 2), (2, 3), (3, 4)] N(tnxtDiGraphRtadd_nodes_fromtadd_nodetadd_edges_fromR(RRRtT((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyR_s    cCsd„t|||ƒDƒS(s Return dictionary of predecessors in depth-first-search from source. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- pred: dict A dictionary with nodes as keys and predecessor nodes as values. Examples -------- >>> G = nx.path_graph(4) >>> nx.dfs_predecessors(G, source=0) {1: 0, 2: 1, 3: 2} >>> nx.dfs_predecessors(G, source=0, depth_limit=2) {1: 0, 2: 1} Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search cSsi|]\}}||“qS(((t.0tstt((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pys ­s (R(RRR((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyR…s(cCsPttƒ}x7t|d|d|ƒD]\}}||j|ƒq%Wt|ƒS(s²Return dictionary of successors in depth-first-search from source. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- succ: dict A dictionary with nodes as keys and list of successor nodes as values. Examples -------- >>> G = nx.path_graph(5) >>> nx.dfs_successors(G, source=0) {0: [1], 1: [2], 2: [3], 3: [4]} >>> nx.dfs_successors(G, source=0, depth_limit=2) {0: [1], 1: [2]} Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search RR(RtlistRRtdict(RRRtdR#R$((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyR°s( %cCs)tj|d|d|ƒ}d„|DƒS(sGenerate nodes in a depth-first-search post-ordering starting at source. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- nodes: generator A generator of nodes in a depth-first-search post-ordering. Examples -------- >>> G = nx.path_graph(5) >>> list(nx.dfs_postorder_nodes(G, source=0)) [4, 3, 2, 1, 0] >>> list(nx.dfs_postorder_nodes(G, source=0, depth_limit=2)) [1, 0] Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search See Also -------- dfs_edges dfs_preorder_nodes dfs_labeled_edges RRcss*|] \}}}|dkr|VqdS(treverseN((R"tutvR'((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pys s(RR(RRRtedges((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyRÞs.cCs)tj|d|d|ƒ}d„|DƒS(sGenerate nodes in a depth-first-search pre-ordering starting at source. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- nodes: generator A generator of nodes in a depth-first-search pre-ordering. Examples -------- >>> G = nx.path_graph(5) >>> list(nx.dfs_preorder_nodes(G, source=0)) [0, 1, 2, 3, 4] >>> list(nx.dfs_preorder_nodes(G, source=0, depth_limit=2)) [0, 1, 2] Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search See Also -------- dfs_edges dfs_postorder_nodes dfs_labeled_edges RRcss*|] \}}}|dkr|VqdS(tforwardN((R"R)R*R'((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pys ?s(RR(RRRR+((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyRs.c cs†|dkr|}n |g}tƒ}|dkrBt|ƒ}nx=|D]5}||kraqIn||dfV|j|ƒ||t||ƒfg}xÕ|ro|d\}}} y{t| ƒ} | |krà|| dfVnN|| dfV|j| ƒ|dkr.|j| |dt|| ƒfƒnWq›tk rk|jƒ|rl|dd|dfVqlq›Xq›W||dfVqIWdS(s Iterate over edges in a depth-first-search (DFS) labeled by type. Parameters ---------- G : NetworkX graph source : node, optional Specify starting node for depth-first search and return edges in the component reachable from source. depth_limit : int, optional (default=len(G)) Specify the maximum search depth. Returns ------- edges: generator A generator of triples of the form (*u*, *v*, *d*), where (*u*, *v*) is the edge being explored in the depth-first search and *d* is one of the strings 'forward', 'nontree', or 'reverse'. A 'forward' edge is one in which *u* has been visited but *v* has not. A 'nontree' edge is one in which both *u* and *v* have been visited but the edge is not in the DFS tree. A 'reverse' edge is on in which both *u* and *v* have been visited and the edge is in the DFS tree. Examples -------- The labels reveal the complete transcript of the depth-first search algorithm in more detail than, for example, :func:`dfs_edges`:: >>> from pprint import pprint >>> >>> G = nx.DiGraph([(0, 1), (1, 2), (2, 1)]) >>> pprint(list(nx.dfs_labeled_edges(G, source=0))) [(0, 0, 'forward'), (0, 1, 'forward'), (1, 2, 'forward'), (2, 1, 'nontree'), (1, 2, 'reverse'), (0, 1, 'reverse'), (0, 0, 'reverse')] Notes ----- If a source is not specified then a source is chosen arbitrarily and repeatedly until all components in the graph are searched. The implementation of this function is adapted from David Eppstein's depth-first search function in `PADS`_, with modifications to allow depth limits based on the Wikipedia article "`Depth-limited search`_". .. _PADS: http://www.ics.uci.edu/~eppstein/PADS .. _Depth-limited search: https://en.wikipedia.org/wiki/Depth-limited_search See Also -------- dfs_edges dfs_preorder_nodes dfs_postorder_nodes R,iÿÿÿÿtnontreeiiR(N( RR R R R R RRR( RRRRRRRRRRR((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyRBs6A             +  !(t__doc__tnetworkxRt collectionsRt__all__RRRRRRRR(((s†/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/traversal/depth_first_search.pyt s  I&+.22