暴风式哭泣;
存板子存板子;
终于搞懂了。mmpiu
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<stack>
#include<memory.h>
#include<ctype.h>
using namespace std;
typedef long long ll;
#define INF 0x3fffffff
const int maxn = 100 + 5;
struct edge
{
int to, cap, rev;
edge(int a,int b,int c):to(a),cap(b),rev(c){}
};
vector<edge> g[maxn*4];
int level[maxn*4];
int iter[maxn*4];
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));
}
void bfs(int s) {
memset(level, -1, sizeof(level));
queue<int> q;
level[s] = 0;
q.push(s);
while (!q.empty()) {
int v = q.front();
q.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;
q.push(e.to);
}
}
}
}
int dfs(int v, int t, int 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])
{ int 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;
}
int max_flow(int s, int t) {
int flow = 0;
for (;;) {
bfs(s);
if (level[t] < 0)return flow;
memset(iter, 0, sizeof(iter));
int f;
while ((f = dfs(s, t, INF)) > 0) {
flow += f;
}
}
}
int N, F, D;
bool likef[maxn][maxn];
bool liked[maxn][maxn];
void solve() {
int s =0;
int t = N * 2 + F + D + 1;
for (int i = 1; i <=F; i++) {
add_edge(s, N * 2 + i,1);
}
for (int i = 1; i <=D; i++) {
add_edge(N * 2 + F + i, t, 1);
}
for (int i = 1; i <=N; i++) {
add_edge(i, N + i, 1);
for (int j = 1; j <= F; j++) {
if (likef[i][j])add_edge(N * 2 + j, i, 1);
}
for (int j = 1; j <= D; j++) {
if (liked[i][j])add_edge(N+i,N * 2+F + j, 1);
}
}
printf("%d\n", max_flow(s, t));
}
int main() {
while (cin >> N >> F >> D) {
memset(liked, 0, sizeof(liked));
memset(likef, 0, sizeof(likef));
int a, b, x;
for (int i = 1; i <= N; i++) {
cin >> a >> b;
for (int j = 0; j < a; j++) {
cin >> x;
likef[i][x] = 1;
}
for (int j = 0; j < b; j++) {
cin >> x;
liked[i][x] = 1;
}
}
solve();
}
}