示例#1
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);
    }
示例#2
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);
    }