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