public static FlowGraph <T> FordFulkerson <T>(this FlowGraph <T> graph) { if (graph.Edges.Where(e => !e.Capacity.HasValue).Any()) { throw new ArgumentException("In dem Graphen muss für jede Kante eine Kapazität definiert sein."); } // Sicherstellen, dass der Fluss bei allen Kanten initialisiert ist. foreach (Edge <T> e in graph.Edges.Where(e => !e.Flow.HasValue)) { e.Flow = 0; } // Eine Kopie des Graphens erstellen. FlowGraph <T> maxFlowGraph = graph.Copy(); // Den Residualgraph erstellen FlowGraph <T> residualGraph = maxFlowGraph.GetResidualGraph(); while (residualGraph.DepthFirstSearch(residualGraph.Source, residualGraph.Target, out List <Edge <T> > path)) { int minAugmentingFlow = path.Select(e => Math.Abs(e.Flow.Value)).Min(); foreach (Edge <T> edge in path) { //Edge<T> edgeToModify = maxFlowGraph.Edges.Where(e => e.From.Equals(edge.From) && e.To.Equals(edge.To)).Single(); Edge <T> edgeToModify = maxFlowGraph.GetEdge(edge.From, edge.To); if (edge.Flow.Value > 0) { edgeToModify.Flow += minAugmentingFlow; } else { edgeToModify.Flow -= minAugmentingFlow; } // edgeToModify.Flow += edge.Flow; } residualGraph = maxFlowGraph.GetResidualGraph(); } return(maxFlowGraph); }