コード例 #1
0
        private void Augment([NotNull] TVertex source, [NotNull] TVertex sink)
        {
            Debug.Assert(source != null);
            Debug.Assert(sink != null);

            // Find minimum residual capacity along the augmenting path
            double  delta = double.MaxValue;
            TVertex u     = sink;
            TEdge   e;

            do
            {
                e     = Predecessors[u];
                delta = Math.Min(delta, ResidualCapacities[e]);
                u     = e.Source;
            } while (!EqualityComparer <TVertex> .Default.Equals(u, source));

            // Push delta units of flow along the augmenting path
            u = sink;
            do
            {
                e = Predecessors[u];
                ResidualCapacities[e] -= delta;
                if (ReversedEdges != null && ReversedEdges.ContainsKey(e))
                {
                    ResidualCapacities[ReversedEdges[e]] += delta;
                }
                u = e.Source;
            } while (!EqualityComparer <TVertex> .Default.Equals(u, source));
        }
コード例 #2
0
        private void Augment(
            TVertex source,
            TVertex sink
            )
        {
            //Contract.Requires(source != null);
            //Contract.Requires(sink != null);

            TEdge   e;
            TVertex u;

            // find minimum residual capacity along the augmenting path
            double delta = double.MaxValue;

            u = sink;
            do
            {
                e     = Predecessors[u];
                delta = Math.Min(delta, ResidualCapacities[e]);
                u     = e.Source;
            } while (!u.Equals(source));

            // push delta units of flow along the augmenting path
            u = sink;
            do
            {
                e = Predecessors[u];
                ResidualCapacities[e] -= delta;
                if (ReversedEdges != null && ReversedEdges.ContainsKey(e))
                {
                    ResidualCapacities[ReversedEdges[e]] += delta;
                }
                u = e.Source;
            } while (!u.Equals(source));
        }
コード例 #3
0
        private void AddReversedEdges([NotNull, ItemNotNull] IEnumerable <TEdge> notReversedEdges)
        {
            foreach (TEdge edge in notReversedEdges)
            {
                if (ReversedEdges.ContainsKey(edge))
                {
                    continue;
                }

                // Already been added
                if (FindReversedEdge(edge, out TEdge reversedEdge))
                {
                    ReversedEdges[edge] = reversedEdge;
                    continue;
                }

                // Need to create one
                reversedEdge = EdgeFactory(edge.Target, edge.Source);
                if (!VisitedGraph.AddEdge(reversedEdge))
                {
                    throw new InvalidOperationException("Cannot add the reversed edge, this should not arrive...");
                }

                _augmentedEdges.Add(reversedEdge);
                ReversedEdges[edge]         = reversedEdge;
                ReversedEdges[reversedEdge] = edge;

                OnReservedEdgeAdded(reversedEdge);
            }
        }
コード例 #4
0
        private IEnumerable <TEdge> FindEdgesToReverse()
        {
            foreach (TEdge edge in VisitedGraph.Edges)
            {
                // If reversed already found, continue
                if (ReversedEdges.ContainsKey(edge))
                {
                    continue;
                }

                if (FindReversedEdge(edge, out TEdge reversedEdge))
                {
                    // Setup edge
                    ReversedEdges[edge] = reversedEdge;

                    // Setup reversed if needed
                    if (!ReversedEdges.ContainsKey(reversedEdge))
                    {
                        ReversedEdges[reversedEdge] = edge;
                    }

                    continue;
                }

                // This edge has no reverse
                yield return(edge);
            }
        }
コード例 #5
0
        /// <summary>
        /// Removes reversed edges that were added.
        /// </summary>
        /// <exception cref="InvalidOperationException">If the graph was not augmented yet.</exception>
        public void RemoveReversedEdges()
        {
            if (!Augmented)
            {
                throw new InvalidOperationException("Graph is not augmented yet.");
            }

            foreach (TEdge edge in _augmentedEdges)
            {
                VisitedGraph.RemoveEdge(edge);
            }

            _augmentedEdges.Clear();
            ReversedEdges.Clear();

            Augmented = false;
        }
コード例 #6
0
        private void Augment([NotNull] TVertex source, [NotNull] TVertex sink)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (sink == null)
            {
                throw new ArgumentNullException(nameof(sink));
            }

            // Find minimum residual capacity along the augmenting path
            double  delta = double.MaxValue;
            TVertex u     = sink;
            TEdge   e;

            do
            {
                e     = Predecessors[u];
                delta = Math.Min(delta, ResidualCapacities[e]);
                u     = e.Source;
            } while (!u.Equals(source));

            // Push delta units of flow along the augmenting path
            u = sink;
            do
            {
                e = Predecessors[u];
                ResidualCapacities[e] -= delta;
                if (ReversedEdges != null && ReversedEdges.ContainsKey(e))
                {
                    ResidualCapacities[ReversedEdges[e]] += delta;
                }
                u = e.Source;
            } while (!u.Equals(source));
        }