| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 
 | #include <bits/stdc++.h>#define MAX_N 2000
 #define MAX_M 100000
 #define INF 0x7f7f7f7f
 using namespace std;
 int n, a, b, f, fa, fb, w[MAX_N+5];
 int s, t, cnt, pr[MAX_N+5], cr[MAX_N+5], mxf, mic;
 struct node {int v, c, w, nxt;} E[MAX_M+5];
 void init() {s = 0, t = n*2+1, memset(pr, -1, sizeof pr);}
 void insert(int u, int v, int c, int w) {E[cnt] = (node){v, c, w, pr[u]}, pr[u] = cnt++;}
 void addedge(int u, int v, int c, int w) {insert(u, v, c, w), insert(v, u, 0, -w);}
 bool SPFA() {
 queue <int> que;	bool inq[MAX_N+5];	int d[MAX_N+5], cr[MAX_N+5];
 memset(inq, false, sizeof inq), memset(d, INF, sizeof d);
 d[s] = 0, que.push(s), inq[s] = true, memset(cr, -1, sizeof cr);
 while (!que.empty()) {
 int u = que.front();	que.pop(), inq[u] = false;
 for (int i = pr[u]; ~i; i = E[i].nxt) {
 int v = E[i].v, c = E[i].c, w = E[i].w;
 if (c && d[u]+w < d[v]) {
 d[v] = d[u]+w, cr[v] = i;
 if (!inq[v]) que.push(v), inq[v] = true;
 }
 }
 }
 if (d[t] == INF) return false;	int flow = INF;
 for (int i = cr[t]; ~i; i = cr[E[i^1].v]) flow = min(flow, E[i].c);
 for (int i = cr[t]; ~i; i = cr[E[i^1].v]) E[i].c -= flow, E[i^1].c += flow;
 mxf += flow, mic += d[t]*flow;	return true;
 }
 int main() {
 scanf("%d%d%d%d%d%d", &n, &a, &b, &f, &fa, &fb), init();
 for (int i = 1; i <= n; i++) scanf("%d", w+i);
 for (int i = 1; i <= n; i++) addedge(s, i, w[i], 0);
 for (int i = 1; i < n; i++) addedge(i, i+1, INF, 0);
 for (int i = 1; i <= n; i++) addedge(s, i+n, INF, f);
 for (int i = 1; i <= n; i++) addedge(i+n, t, w[i], 0);
 for (int i = 1; i < n-a; i++) addedge(i, i+a+n+1, INF, fa);
 for (int i = 1; i < n-b; i++) addedge(i, i+b+n+1, INF, fb);
 while (SPFA()) ;	return printf("%d", mic), 0;
 }
 
 |