private void EnqueueDeviationPaths( IQueue <DeviationPath> queue, TVertex root, IDictionary <TVertex, TEdge> successors, IDictionary <TVertex, double> distances, TEdge[] path, int startEdge ) { Contract.Requires(queue != null); Contract.Requires(root != null); Contract.Requires(successors != null); Contract.Requires(distances != null); Contract.Requires(path != null); Contract.Requires(EdgeExtensions.IsAdjacent <TVertex, TEdge>(path[0], root)); Contract.Requires(0 <= startEdge && startEdge < path.Length); TVertex previousVertex = root; double previousWeight = 0; var pathVertices = new Dictionary <TVertex, int>(path.Length); for (int iedge = 0; iedge < path.Length; ++iedge) { var edge = path[iedge]; if (iedge >= startEdge) { this.EnqueueDeviationPaths( queue, distances, path, iedge, previousVertex, previousWeight, pathVertices ); } // update counter previousVertex = edge.Target; previousWeight += this.edgeWeights(edge); // detection of loops if (iedge == 0) { pathVertices[edge.Source] = 0; } // we should really allow only one key if (pathVertices.ContainsKey(edge.Target)) { break; } pathVertices[edge.Target] = 0; } }