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); }
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)); }
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); }
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); }