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)); }
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)); }
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); } }
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); } }
/// <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; }
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)); }