Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
                    }
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }