Exemplo n.º 1
0
    public void Solve()
    {
        var mf = new MaxFlow_Dinic();

        int NN = N + 2;
        int S = 0, T = N + 1;

        mf.Init(NN);
        long tot = 0;
        long Inf = (long)1e18;

        for (int i = 1; i <= N; i++)
        {
            if (A[i - 1] <= 0)
            {
                mf.AddEdge(S, i, -A[i - 1]);
            }
            if (A[i - 1] > 0)
            {
                mf.AddEdge(i, T, A[i - 1]);
                tot += A[i - 1];
            }
            for (int j = i + i; j <= N; j += i)
            {
                mf.AddEdge(i, j, Inf);
            }
        }
        var f = mf.MaxFlow(S, T);

        Console.WriteLine(tot - f);
    }
Exemplo n.º 2
0
    public void Solve()
    {
        var mf   = new MaxFlow_Dinic();
        int NN   = 2 * N + 2;
        int src  = 2 * N;
        int sinc = src + 1;

        mf.Init(NN);
        for (int i = 0; i < N; i++)
        {
            mf.AddEdge(src, i, (int)1);
        }
        for (int i = 0; i < N; i++)
        {
            mf.AddEdge(i + N, sinc, (int)1);
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (A[i] < C[j] && B[i] < D[j])
                {
                    mf.AddEdge(i, j + N, 1);
                }
            }
        }

        Console.WriteLine(mf.MaxFlow(src, sinc));
    }
Exemplo n.º 3
0
    public void Solve()
    {
        var MF     = new MaxFlow_Dinic();
        int HW     = H * W;
        int N      = 2 * HW + 2;
        int source = 2 * HW;
        int sink   = source + 1;

        MF.Init(N);

        int Inf = (int)1e9;
        int rcs = 0, rct = 0;

        for (int i = 0; i < H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                if (S[i][j] == '.')
                {
                    continue;
                }

                if (S[i][j] == 'o')
                {
                    MF.AddEdge(i * W + j, i * W + j + HW, 1);
                }
                if (S[i][j] == 'S')
                {
                    MF.AddEdge(i * W + j, i * W + j + HW, Inf); rcs = i * W + j;
                }
                if (S[i][j] == 'T')
                {
                    MF.AddEdge(i * W + j, i * W + j + HW, Inf); rct = i * W + j;
                }

                for (int ii = 0; ii < H; ii++)
                {
                    if (ii == i)
                    {
                        continue;
                    }
                    if (S[ii][j] != '.')
                    {
                        MF.AddEdge(i * W + j + HW, ii * W + j, Inf);
                    }
                }
                for (int jj = 0; jj < W; jj++)
                {
                    if (jj == j)
                    {
                        continue;
                    }
                    if (S[i][jj] != '.')
                    {
                        MF.AddEdge(i * W + j + HW, i * W + jj, Inf);
                    }
                }
            }
        }

        if (rcs / W == rct / W || rcs % W == rct % W)
        {
            Console.WriteLine(-1);
            return;
        }

        MF.AddEdge(source, rcs, Inf);
        MF.AddEdge(rct + HW, sink, Inf);

        var ans = MF.MaxFlow(source, sink);

        Console.WriteLine(ans);
    }
Exemplo n.º 4
0
    public void Solve()
    {
        for (int i = 0; i < N; i++)
        {
            Array.Sort(Q[i]);
        }

        /*
         * if(N == 1){
         *      int cnt = 0;
         *      for(int j=0;j<P;j++){
         *              int r = 10 * Q[0][j] / (9 * R[0]);
         *              int l = 10 * Q[0][j] / (11 * R[0]); if(10 * Q[0][j] % (11 * R[0]) != 0) l++;
         *              if(l <= r) cnt++;
         *      }
         *      Console.WriteLine(cnt);
         *      return;
         * }
         */
        int[][] ll = new int[N][];
        int[][] rr = new int[N][];
        for (int i = 0; i < N; i++)
        {
            ll[i] = new int[P];
            rr[i] = new int[P];
            for (int j = 0; j < P; j++)
            {
                int r = 10 * Q[i][j] / (9 * R[i]);
                int l = 10 * Q[i][j] / (11 * R[i]); if (10 * Q[i][j] % (11 * R[i]) != 0)
                {
                    l++;
                }
                ll[i][j] = l;
                rr[i][j] = r;
            }
        }

        int NP  = P * N;
        int NV  = NP * 2 + 2;
        int src = NP * 2;
        int dst = NP * 2 + 1;
        int Inf = (int)1e6;
        var MF  = new MaxFlow_Dinic();

        MF.Init(NV);

        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < P; j++)
            {
                if (ll[i][j] <= rr[i][j])
                {
                    MF.AddEdge(i * P + j, i * P + j + NP, 1);
                }
            }
        }

        for (int j = 0; j < P; j++)
        {
            MF.AddEdge(src, j, Inf);
        }
        for (int j = 0; j < P; j++)
        {
            MF.AddEdge((N - 1) * P + j + NP, dst, Inf);
        }
        for (int i = 0; i < N - 1; i++)
        {
            for (int j = 0; j < P; j++)
            {
                for (int k = 0; k < P; k++)
                {
                    if (Intersects(ll[i][j], rr[i][j], ll[i + 1][k], rr[i + 1][k]))
                    {
                        MF.AddEdge(i * P + j + NP, (i + 1) * P + k, Inf);
                    }
                }
            }
        }
        var res = MF.MaxFlow(src, dst);

        Console.WriteLine(res);
    }