/// <summary> /// Finds all possible paths via edges between two vertices. /// </summary> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <param name="graph"></param> /// <param name="start"></param> /// <param name="destination"></param> /// <param name="vertexComparer"></param> /// <returns></returns> public static IEnumerable <IReadOnlyList <DirectedEdge <V, E> > > FindAllEdges <V, E>(this IDirectedGraph <V, E> graph, V start, V destination, IEqualityComparer <V> vertexComparer = null) { using (Trace.Entering()) { vertexComparer = vertexComparer ?? EqualityComparer <V> .Default; List <List <DirectedEdge <V, E> > > edgePaths = new List <List <DirectedEdge <V, E> > >(); var vertexPaths = graph.FindAllPaths(start, destination, vertexComparer).ToList(); foreach (var path in vertexPaths) { List <List <DirectedEdge <V, E> > > edgePossibilities = new List <List <DirectedEdge <V, E> > >(); for (int i = 1; i < path.Count; ++i) { var from = path[i - 1]; var to = path[i]; var fromToEdges = graph.GetEdges(from, to).ToList(); if (fromToEdges.Count > 0) { edgePossibilities.Add(fromToEdges); } } var allPathVariations = edgePossibilities.GetVariations(); foreach (var pathVariation in allPathVariations) { edgePaths.Add(pathVariation.ToList()); } } return(edgePaths); } }