Example #1
0
        /// <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);
            }
        }