public static List <IEnumerable <TaggedEdge <string, string> > > GetPaths(AdjacencyGraph <string, TaggedEdge <string, string> > g) { var dfs = new EdgeDepthFirstSearchAlgorithm <string, TaggedEdge <string, string> >(g); var recorder = new EdgePredecessorRecorderObserver <string, TaggedEdge <string, string> >(); List <IEnumerable <TaggedEdge <string, string> > > results = new List <IEnumerable <TaggedEdge <string, string> > >(); using (recorder.Attach(dfs)) { dfs.Compute(); var paths = recorder.AllPaths(); foreach (var p in paths) { results.Add(p); } } return(results); }
public void AllPaths() { { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); var graph = new AdjacencyGraph <int, Edge <int> >(); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); CollectionAssert.IsEmpty(recorder.AllPaths()); } } { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); // Graph without cycle var edge12 = new Edge <int>(1, 2); var edge13 = new Edge <int>(1, 3); var edge14 = new Edge <int>(1, 4); var edge24 = new Edge <int>(2, 4); var edge31 = new Edge <int>(3, 1); var edge33 = new Edge <int>(3, 3); var edge34 = new Edge <int>(3, 4); var graph = new AdjacencyGraph <int, Edge <int> >(); graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33, edge34 }); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); CollectionAssert.AreEquivalent( new IEnumerable <Edge <int> >[] { new[] { edge12, edge24 }, new[] { edge13, edge31, edge14 }, new[] { edge13, edge33, edge34 } }, recorder.AllPaths()); } } { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); // Graph with cycle var edge12 = new Edge <int>(1, 2); var edge13 = new Edge <int>(1, 3); var edge14 = new Edge <int>(1, 4); var edge24 = new Edge <int>(2, 4); var edge31 = new Edge <int>(3, 1); var edge33 = new Edge <int>(3, 3); var edge34 = new Edge <int>(3, 4); var edge41 = new Edge <int>(4, 1); var graph = new AdjacencyGraph <int, Edge <int> >(); graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33, edge34, edge41 }); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); CollectionAssert.AreEquivalent( new IEnumerable <Edge <int> >[] { new[] { edge12, edge24, edge41, edge13, edge31, edge14 }, new[] { edge12, edge24, edge41, edge13, edge33, edge34 } }, recorder.AllPaths()); } } }