Example #1
0
    static void Main()
    {
        var(n, m) = Read2();
        var a = Read();
        var b = Read();
        var r = Read();

        var sv = n + 3;
        var ev = sv + 1;
        var mf = new MinCostFlow(ev + 1);

        for (int i = 0; i < 3; i++)
        {
            mf.AddEdge(sv, n + i, m, 0);
        }

        for (int j = 0; j < n; j++)
        {
            long p = a[j];
            for (int i = 0; i < 3; i++)
            {
                mf.AddEdge(n + i, j, 1, -(p *= b[j]) % r[i]);
            }

            mf.AddEdge(j, ev, 1, p  = a[j] * b[j]);
            mf.AddEdge(j, ev, 1, p *= b[j] - 1);
            mf.AddEdge(j, ev, 1, p *= b[j]);
        }

        Console.WriteLine(-mf.GetMinCost(sv, ev, 3 * m));
    }
Example #2
0
    public void Solve()
    {
        int N = Reader.Int(), M = Reader.Int();
        var Es   = Reader.IntTable(M);
        var flow = new MinCostFlow(N);

        foreach (var e in Es)
        {
            e[0]--; e[1]--;
            flow.AddEdge(e[0], e[1], 1, e[2]);
            if (e[0] != 0)
            {
                flow.AddEdge(e[1], e[0], 1, e[2]);
            }
        }
        int ans = MinCostFlow.INF;

        for (int a = 1; a < N; a++)
        {
            ans = Math.Min(ans, flow.Run(0, a, 2, ans));
        }
        if (ans == MinCostFlow.INF)
        {
            ans = -1;
        }
        Console.WriteLine(ans);
    }
Example #3
0
    static void Main()
    {
        var(n, k) = Read2();
        var a = Array.ConvertAll(new bool[n], _ => Read());

        var sv = 2 * n;
        var ev = sv + 1;

        MinCostFlow CreateFlow()
        {
            var mf = new MinCostFlow(ev + 1);

            for (int i = 0; i < n; i++)
            {
                mf.AddEdge(sv, i, k, 0);
                mf.AddEdge(n + i, ev, k, 0);
            }

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    mf.AddEdge(i, n + j, 1, -a[i][j]);
                }
            }
            return(mf);
        }

        var mf = CreateFlow();

        var(_, f) = mf.GetMinCostForRange(sv, ev, n * k);
        mf        = CreateFlow();
        var min = mf.GetMinCost(sv, ev, f);
        var map = mf.Map;

        var s = NewArray2(n, n, '.');

        for (int v = 0; v < n; v++)
        {
            foreach (var e in map[v])
            {
                if (e.Capacity == 0 && e.To != sv)
                {
                    s[v][e.To - n] = 'X';
                }
            }
        }

        Console.WriteLine(-min);
        foreach (var r in s)
        {
            Console.WriteLine(new string(r));
        }
    }
Example #4
0
    static object Solve()
    {
        var(p, q) = Read2();
        var s  = Array.ConvertAll(new bool[p], _ => Console.ReadLine());
        var ps = Array.ConvertAll(new bool[p], _ => Read2L());
        var qs = Array.ConvertAll(new bool[q], _ => Read2L());

        var sv = p + q;
        var ev = sv + 1;
        var mf = new MinCostFlow(ev + 1);

        for (int i = 0; i < p; ++i)
        {
            mf.AddEdge(sv, i, 1, 0);
        }

        for (int j = 0; j < q; ++j)
        {
            mf.AddEdge(p + j, ev, 1, 0);
        }

        for (int i = 0; i < p; ++i)
        {
            var pa = ps[i].a - ps[i].b;
            for (int j = 0; j < q; ++j)
            {
                var qa = qs[j].a - qs[j].b;
                if (s[i][j] == '1' && pa + qa > 0)
                {
                    mf.AddEdge(i, p + j, 1, -pa - qa);
                }
            }
        }

        var r0 = ps.Sum(_ => _.b) + qs.Sum(_ => _.b);
        var r  = mf.GetMinCostForRange(sv, ev, Math.Min(p, q));

        if (r == long.MaxValue)
        {
            r = 0;
        }
        return(r0 - r);
    }
Example #5
0
    static object Solve()
    {
        var(n, c) = Read2();
        var a = Read();

        var sv = 2 * n;
        var ev = sv + 1;
        var mf = new MinCostFlow(ev + 1);

        for (int i = 0; i < n; ++i)
        {
            mf.AddEdge(sv, i, 1, c);
            mf.AddEdge(n + i, ev, 1, 0);
            mf.AddEdge(i, n + i, 1, -max);

            for (int j = i + 1; j < n; j++)
            {
                mf.AddEdge(n + i, j, 1, Math.Abs(a[i] - a[j]));
            }
        }

        return(mf.GetMinCostForRange(sv, ev, n) + n * max);
    }