| 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
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 
 | #include <bits/stdc++.h>#define MAX_N 4000
 #define MAX_M 5000000
 #define INF 0x3f3f3f3f
 using namespace std;
 template <class T> inline void read(T &x) {
 x = 0; int c = getchar(), f = 1;
 for (; !isdigit(c); c = getchar()) if (c == 45) f = -1;
 for (; isdigit(c); c = getchar()) (x *= 10) += f*(c-'0');
 }
 int n, m, s, t, cnt, sum, d[MAX_N+5], pr[MAX_N+5], cr[MAX_N+5];
 struct node {int v, c, nxt;} E[MAX_M+5];
 void init() {s = 0, t = 4000, cnt = 0, memset(pr, -1, sizeof pr);}
 void insert(int u, int v, int c) {E[cnt] = (node){v, c, pr[u]}, pr[u] = cnt++;}
 void addedge(int u, int v, int c) {insert(u, v, c), insert(v, u, 0);}
 bool BFS() {
 queue <int> que; que.push(s);
 memset(d, -1, sizeof d), d[s] = 0;
 while (!que.empty()) {
 int u = que.front(); que.pop();
 for (int i = pr[u]; ~i; i = E[i].nxt) {
 int v = E[i].v, c = E[i].c;
 if (~d[v] || !c) continue;
 d[v] = d[u]+1, que.push(v);
 }
 }
 return ~d[t];
 }
 int DFS(int u, int flow) {
 if (u == t) return flow;	int ret = 0;
 for (int &i = pr[u]; ~i; i = E[i].nxt) {
 int v = E[i].v, c = E[i].c;
 if (d[u]+1 != d[v] || !c) continue;
 int tmp = DFS(v, min(flow, c));
 E[i].c -= tmp, E[i^1].c += tmp;
 flow -= tmp, ret += tmp;
 if (!flow) break;
 }
 if (!ret) d[u] = -1;	return ret;
 }
 void cpy() {for (int i = s; i <= t; i++) cr[i] = pr[i];}
 void rec() {for (int i = s; i <= t; i++) pr[i] = cr[i];}
 int Dinic() {int ret = 0; cpy(); while (BFS()) ret += DFS(s, INF), rec(); return ret;}
 int main() {
 read(n), init();
 for (int i = 1, x; i <= n; i++) read(x), addedge(s, i, x), sum += x;
 for (int i = 1, x; i <= n; i++) read(x), addedge(i, t, x), sum += x;
 read(m);
 for (int i = 1, c1, c2, k; i <= m; i++) {
 read(k), read(c1), read(c2), sum += c1+c2;
 addedge(s, n+i*2-1, c1), addedge(n+i*2, t, c2);
 for (int j = 0, x; j < k; j++)
 read(x), addedge(n+i*2-1, x, INF), addedge(x, n+i*2, INF);
 }
 return printf("%d\n", sum-Dinic()), 0;
 }
 
 |