diff --git a/src/algorithms.rs b/src/algorithms.rs index 730ed4c..b974441 100644 --- a/src/algorithms.rs +++ b/src/algorithms.rs @@ -122,12 +122,12 @@ where G: GraphTopology, { let mut predecessors = graph.vertex_map(None); - let (distances, _) = bfs_impl(graph, source, |neighbor, predecessor| { + let result = bfs_impl(graph, source, |neighbor, predecessor| { predecessors[neighbor] = Some(predecessor); true }); BfsResult { - distances, + distances: result.distances, predecessors, } } @@ -136,7 +136,7 @@ pub fn bfs_distances(graph: &G, source: G::Vertex) -> VertexMap(graph: &G, source: G::Vertex, target: G::Vertex) -> Option @@ -154,14 +154,15 @@ where if predicate(source) { return Some((source, 0)); } - bfs_impl(graph, source, |neighbor, _| !predicate(neighbor)).1 + bfs_impl(graph, source, |neighbor, _| !predicate(neighbor)).found } -fn bfs_impl( - graph: &G, - source: G::Vertex, - mut on_discover: F, -) -> (VertexMap>, Option<(G::Vertex, u32)>) +struct BfsImplResult { + distances: VertexMap>, + found: Option<(V, u32)>, +} + +fn bfs_impl(graph: &G, source: G::Vertex, mut on_discover: F) -> BfsImplResult where G: GraphTopology, F: FnMut(G::Vertex, G::Vertex) -> bool, @@ -178,13 +179,19 @@ where let distance = distances[v].unwrap() + 1; distances[neighbor] = Some(distance); if !on_discover(neighbor, v) { - return (distances, Some((neighbor, distance))); + return BfsImplResult { + distances, + found: Some((neighbor, distance)), + }; } queue.push_back(neighbor); } } } - (distances, None) + BfsImplResult { + distances, + found: None, + } } pub struct DfsResult { @@ -197,12 +204,12 @@ where G: GraphTopology, { let mut predecessors = graph.vertex_map(None); - let (visited, _) = dfs_impl(graph, source, |neighbor, predecessor| { + let result = dfs_impl(graph, source, |neighbor, predecessor| { predecessors[neighbor] = Some(predecessor); true }); DfsResult { - visited, + visited: result.visited, predecessors, } } @@ -211,7 +218,7 @@ pub fn dfs_visited(graph: &G, source: G::Vertex) -> VertexMap(graph: &G, source: G::Vertex, target: G::Vertex) -> bool @@ -229,14 +236,15 @@ where if predicate(source) { return Some(source); } - dfs_impl(graph, source, |neighbor, _| !predicate(neighbor)).1 + dfs_impl(graph, source, |neighbor, _| !predicate(neighbor)).found } -fn dfs_impl( - graph: &G, - source: G::Vertex, - mut on_discover: F, -) -> (VertexMap, Option) +struct DfsImplResult { + visited: VertexMap, + found: Option, +} + +fn dfs_impl(graph: &G, source: G::Vertex, mut on_discover: F) -> DfsImplResult where G: GraphTopology, F: FnMut(G::Vertex, G::Vertex) -> bool, @@ -248,7 +256,10 @@ where while let Some((v, predecessor)) = stack.pop() { if let Some(p) = predecessor { if !on_discover(v, p) { - return (visited, Some(v)); + return DfsImplResult { + visited, + found: Some(v), + }; } } for neighbor in graph.adjacent_vertices(v) { @@ -258,7 +269,10 @@ where } } } - (visited, None) + DfsImplResult { + visited, + found: None, + } } pub fn dfs_find_path(graph: &G, source: G::Vertex, target: G::Vertex) -> Option>