或饮料。求一次最大流即为结果。
#include<cstdio> #include<vector> #include<queue> #include<cstring> using namespace std; ×î´óÁ÷¿ªÊ¼// typedef int cap_type; #define MAX_V 800 + 30 + 16 // ÓÃÓÚ±íʾ±ßµÄ½á¹¹Ì壨Öյ㡢ÈÝÁ¿¡¢·´Ïò±ß£© struct edge { int to, rev; cap_type cap; edge(int to, cap_type cap, int rev) : to(to), cap(cap), rev(rev) {} }; vector <edge> G[MAX_V]; // ͼµÄÁÚ½Ó±í±íʾ int level[MAX_V]; // ¶¥µãµ½Ô´µãµÄ¾àÀë±êºÅ int iter[MAX_V]; // µ±Ç°»¡£¬ÔÚÆä֮ǰµÄ±ßÒѾûÓÐÓÃÁË // ÏòͼÖмÓÈëÒ»Ìõ´Ófromµ½toµÄÈÝÁ¿ÎªcapµÄ±ß void add_edge(int from, int to, int cap) { G[from].push_back(edge(to, cap, G[to].size())); G[to].push_back(edge(from, 0, G[from].size() - 1)); } // ͨ¹ýBFS¼ÆËã´ÓÔ´µã³ö·¢µÄ¾àÀë±êºÅ void bfs(int s) { memset(level, -1, sizeof(level)); queue<int> que; level[s] = 0; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < G[v].size(); ++i) { edge &e = G[v][i]; if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } // ͨ¹ýDFSѰÕÒÔö¹ã· cap_type dfs(int v, int t, cap_type f) { if (v == t) { return f; } for (int &i = iter[v]; i < G[v].size(); ++i) { edge &e = G[v][i]; if (e.cap > 0 && level[v] < level[e.to]) { cap_type d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } // Çó½â´Ósµ½tµÄ×î´óÁ÷ cap_type max_flow(int s, int t) { cap_type flow = 0; for (;;) { bfs(s); if (level[t] < 0) { return flow; } memset(iter, 0, sizeof(iter)); cap_type f; while ((f = dfs(s, t, 0x3f3f3f3f3f3f3f3f)) > 0) { flow += f; } } } ///×î´óÁ÷½áÊø/ int main() { int n,f,d,a,b,c; scanf("%d%d%d",&n,&f,&d); int t = 2*n+f+d+2; for(int i=1;i<=f;i++) add_edge(0,i,1); for(int i=1;i<=d;i++) add_edge(i+f,t,1); for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b); add_edge(i+f+d,i+f+d+n,1); for(int j=0;j<a;j++) { scanf("%d",&c); add_edge(c,i+f+d,1); } for(int j=0;j<b;j++) { scanf("%d",&c); add_edge(i+f+d+n,f+c,1); } } int ans = max_flow(0,t); printf("%d\n",ans); return 0; }