Although I don't know why ......
C ++ code:
# Include <iostream> # include <cstdio> # include <cstring> # define maxn 200 # define INF 1000000000 using namespace STD; int limit_max_flow (INT, int [] [maxn], int [] [maxn], Int, Int, int [] [maxn]); void _ max_flow (INT, int [] [maxn], Int, Int, int [] [maxn]); int main () {int n, m, mat [200] [200], BF [200] [200], flow [200] [200], I, K, J, ID, G, U, d, p, q; while (scanf ("% d", & N, & M) = 2) {memset (MAT, 0, sizeof (MAT )); Memset (Bf, 0, sizeof (BF); memset (flow, 0, sizeof (flow); for (I = 1; I <= N; I ++) {scanf ("% d", & K); For (j = 1; j <= K; j ++) {scanf ("% d", & ID ); mat [n + id] [I] = 1 ;}}for (I = 1; I <= m; I ++) {scanf ("% d ", & U); MAT [0] [n + I] = u;} for (I = 1; I <= m; I ++) {scanf ("% d ", & D); BF [0] [n + I] = D;} scanf ("% d", & G); for (I = 1; I <= g; I ++) {scanf ("% d", & P); For (j = 1; j <= P; j ++) {scanf ("% d ", & Q); For (k = 1; k <= m; k ++) if (MAT [N + k] [Q]) {mat [n + k] [Q] = 0; mat [n + k] [n + M + I] = mat [n + M + I] [Q] = 1 ;}} for (I = 1; I <= N; I ++) mat [I] [n + M + G + 1] = 1; printf ("% d \ n ", limit_max_flow (n + M + G + 2, mat, BF, 0, N + M + G + 1, flow);} return 0;} int limit_max_flow (int n, int mat [] [maxn], int BF [] [maxn], int source, int sink, int flow [] [maxn]) {int I, j, SK, KS; if (Source = sink) return INF; For (MAT [N] [n + 1] = mat [n + 1] [N] = mat [N] [N] = mat [n + 1] [n + 1] = I = 0; I <n; I ++) for (MAT [N] [I] = mat [I] [N] = mat [n + 1] [I] = mat [I] [n + 1] = J = 0; j <n; j ++) {mat [I] [J]-= BF [I] [J]; mat [N] [I] + = BF [J] [I]; MAT [I] [n + 1] + = BF [I] [J];} SK = mat [Source] [sink]; Ks = mat [sink] [Source]; MAT [Source] [sink] = mat [sink] [Source] = inf; for (I = 0; I <n + 2; I ++) for (j = 0; j <n + 2; flow [I] [J ++] = 0); _ max_flow (n + 2, mat, n, n + 1, flow); for (I = 0; I <N; I ++) if (flow [N] [I] <mat [N] [I]) Return-1; flow [Source] [sink] = flow [sink] [Source] = 0; MAT [Source] [sink] = Sk; MAT [sink] [Source] = KS; _ max_flow (n, mat, source, sink, flow); for (I = 0; I <n; I ++) for (j = 0; j <N; j ++) {mat [I] [J] + = BF [I] [J]; flow [I] [J] + = BF [I] [J];} for (I = J = 0; I <n; j + = flow [Source] [I ++]); Return J;} void _ max_flow (INT N, int mat [] [maxn], int source, int sink, int flow [] [maxn]) {I NT pre [maxn], que [maxn], d [maxn], p, q, T, I, J; For (;) {for (I = 0; I <n; Pre [I ++] = 0); Pre [T = source] = source + 1; d [T] = inf; For (P = q = 0; P <= Q &&! Pre [sink]; t = que [p ++]) for (I = 0; I <n; I ++) if (! Pre [I] & (j = mat [T] [I]-flow [T] [I]) {pre [que [q ++] = I] = t + 1; d [I] = d [T] <j? D [T]: J;} else if (! Pre [I] & (j = flow [I] [T]) {pre [que [q ++] = I] =-t-1; d [I] = d [T] <j? D [T]: J;} If (! Pre [sink]) break; for (I = sink; I! = Source;) if (pre [I]> 0) {flow [pre [I]-1] [I] + = d [sink]; I = pre [I]-1;} else {flow [I] [-pre [I]-1]-= d [sink]; I =-pre [I]-1 ;}}}