Ejemplo 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);
        }
Ejemplo n.º 2
0
        public virtual long[] Solve(long flightCount, long crewCount, long[][] info)
        {
            Network network = ConstructNetwork(flightCount, crewCount, info);

            FindMatching(network, 0, network.Size() - 1, flightCount);
            return(AssignJobs(network, flightCount));
        }
Ejemplo n.º 3
0
        public virtual long Solve(long stockCount, long pointCount, long[][] matrix)
        {
            Network network = ConstructNetwork(stockCount, pointCount, matrix);

            Maxflow(network, 0, network.Size() - 1);
            return(GetOverlaidCharts(network, stockCount));
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
        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;
            }
        }