private void FindMatching(Network network, int start, int end, long flightCount) { int size = network.Size(); long[] parent = new long[size]; do { BFS(network, start, end, size, ref parent); if (parent[end] != -1) { long X = long.MaxValue; // finding minimum X for (long edgeID = parent[end]; edgeID != -1; edgeID = parent[network.GetEdge((int)edgeID).Start]) { X = Math.Min(X, network.GetEdge((int)edgeID).Capacity); } for (long edgeID = parent[end]; edgeID != -1; edgeID = parent[network.GetEdge((int)edgeID).Start]) { network.AddFlow(X, (int)edgeID); } } } while (parent[end] != -1); }
private void Maxflow(Network network, int source, int sink) { long flow = 0; int size = network.Size(); while (true) { var result = BFS(network, source, sink, size); if (result.Item1.Count == 0) { return; } foreach (int id in result.Item1) { network.AddFlow(result.Item2, id); } flow += result.Item2; } }
private long Maxflow(Network network, int start, long end) { long flow = 0; int size = network.Size(); while (true) { var result = BFS(network, start, end, size); if (result.Item1.Count == 0) { return(flow); } foreach (int id in result.Item1) { network.AddFlow(result.Item2, id); } flow += result.Item2; } }