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 BFS(Network network, int start, int end, int size, ref long[] parent) { Queue <long> queue = new Queue <long>(); parent = Enumerable.Repeat <long>(-1, size).ToArray(); bool[] marked = new bool[size]; queue.Enqueue(start); marked[start] = true; while (queue.Count > 0) { long current = queue.Dequeue(); foreach (int id in network.GetIds(current)) { Edge e = network.GetEdge(id); if (parent[e.End] == -1 && e.Capacity > 0 && !marked[e.End]) { parent[e.End] = id; queue.Enqueue(e.End); marked[e.End] = true; } } } }
private long GetOverlaidCharts(Network network, long stockCount) { int count = 0; for (int i = 1; i <= stockCount; i++) { foreach (var id in network.GetIds(i)) { if (network.GetEdge(id).Flow > 0) { count++; break; } } } return(stockCount - count); }
private long[] AssignJobs(Network network, long flightCount) { long[] result = Enumerable.Repeat <long>(-1, (int)flightCount).ToArray(); for (int i = 0; i < flightCount; i++) { foreach (int id in network.GetIds(i + 1)) { Edge e = network.GetEdge(id); if (e.Flow == 1) { result[i] = e.End - flightCount; break; } } } return(result); }