|
return flow; } int Maxflow(int s, int t) { this->s = s; this->t = t; int flow = 0; while (BFS()) { flow += Augment(); } return flow; } }; EK ek; //cow 1 -- 2 * n //food 2 * n + 1 --- 2 * n + f //drink 2 * n + f + 1 --- 2 * n + f + d //start 0 //sink 2 * n + f + d + 1 int n, f, d; void init() { int s = 0, t = 2 * n + d + f + 1; ek.init(t); for (int i = 1; i <= f; i++) { ek.AddEdge(0, 2 * n + i, 1); } for (int i = 1; i <= d; i++) { ek.AddEdge(2 * n + f + i, t, 1); } int fi, di, x; for (int i = 1; i <= n; i++) { scanf(%d%d, &fi, &di); ek.AddEdge(i, n + i, 1); for (int j = 0; j < fi; j++) { scanf(%d, &x); ek.AddEdge(2 * n + x, i, 1); } for (int j = 0; j < di; j++) { scanf(%d, &x); ek.AddEdge(n + i, 2 * n + f + x, 1); } } int flow = ek.Maxflow(s, t); printf(%d , flow); } int main() { while (scanf(%d%d%d, &n, &f, &d) != EOF) { init(); } return 0; }
?
|