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