/* ID: wuqi9395@126.com PROG: LANG: C++ */ #include<map> #include<set> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<string> #include<fstream> #include<cstring> #include<ctype.h> #include<iostream> #include<algorithm> #define maxn 1000 #define maxm 10000 #define INF (1<<30) #define PI acos(-1.0) #define mem(a, b) memset(a, b, sizeof(a)) #define For(i, n) for (int i = 0; i < n; i++) typedef long long ll; using namespace std; int M, N, A, K, B; int pig[maxn + 10] = {0}; int has[maxn + 10] = {0}; struct node { int v, f, nxt; }e[maxm * 2 + 10]; int g[maxn] = {0}, cnt, st = 0, ed; void add(int u, int v, int c) { e[++cnt].v = v; e[cnt].f = c; e[cnt].nxt = g[u]; g[u] = cnt; e[++cnt].v = u; e[cnt].f = 0; e[cnt].nxt = g[v]; g[v] = cnt; } void init() { cnt = 1; ed = N + 1; for (int i = 1; i <= M; i++) scanf("%d", pig + i); for (int i = 1; i <= N; i++) { scanf("%d", &A); int sum = 0; while(A--) { scanf("%d", &K); if (!has[K]) sum += pig[K]; else add(has[K], i, INF); has[K] = i; } add(st, i, sum); scanf("%d", &B); add(i, ed, B); } } int dis[maxn + 10], vis[maxn + 10], q[maxn + 10]; void bfs() { mem(dis, 0); int font = 0, rear = 1; q[font] = st; vis[st] = 1; while(font < rear) { int u = q[font++]; for (int i = g[u]; i; i = e[i].nxt) if (e[i].f && !vis[e[i].v]) { vis[e[i].v] = 1; q[rear++] = e[i].v; dis[e[i].v] = dis[u] + 1; } } } int dfs(int u, int delta) { if (u == ed) return delta; else { int ret = 0; for (int i = g[u]; i && delta; i = e[i].nxt) if (e[i].f && dis[e[i].v] == dis[u] + 1) { int dd = dfs(e[i].v, min(delta, e[i].f)); e[i].f -= dd; e[i ^ 1].f += dd; delta -= dd; ret += dd; } return ret; } } int maxflow() { int ret = 0; while(1) { mem(vis, 0); bfs(); if (!vis[ed]) return ret; ret += dfs(st, INF); } } int main () { scanf("%d%d", &M, &N); init(); printf("%d\n", maxflow()); return 0; }
[POJ 1149] PIGS (网络流最大流),布布扣,bubuko.com
原文:http://blog.csdn.net/sio__five/article/details/20795691