public void AddEdge(int from, int to, long capacity) { if (capacity <= 0) { throw new ArgumentException("Forward edge capacity should be greater than 0"); } var e1 = new FlowEdge(from, to, capacity); var e2 = new FlowEdge(to, from, 0); e1.Residual = e2; e2.Residual = e1; Graph[from].Add(e1); Graph[to].Add(e2); }
private long Bfs() { var q = new Queue <int>(); Visit(Source); q.Enqueue(Source); var prev = new FlowEdge[NumberOfNodes]; while (q.Count > 0) { var node = q.Dequeue(); if (node == Sink) { break; } foreach (var edge in Graph[node]) { var capacity = edge.RemainingCapacity; if (capacity > 0 && !HasBeenVisited(edge.To)) { Visit(edge.To); prev[edge.To] = edge; q.Enqueue(edge.To); } } } if (prev[Sink] == null) { return(0); } var bottleNeck = long.MaxValue; for (var edge = prev[Sink]; edge != null; edge = prev[edge.From]) { bottleNeck = Math.Min(bottleNeck, edge.RemainingCapacity); } for (var edge = prev[Sink]; edge != null; edge = prev[edge.From]) { edge.Augment(bottleNeck); } return(bottleNeck); }