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