裸Dinic模板
#include <iostream>
#include <string.h>#include <stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
#define inf 1000000000
#define MAXN 555
struct Edge
{
int v, f, next;
};
int n, f, d, src, sink;
int g[50010];
int nume;
Edge e[50010];
void Addedge( int u, int v, int c)
{
e[nume].v = v, e[nume].f = c, e[nume].next = g[u];
g[u] = nume++;
e[nume].v = u, e[nume].f = 0, e[nume].next = g[v];
g[v] = nume++;
};
void init( )
{
memset( g, -1, sizeof(g));
nume = 0;
}
queue< int > que;
bool vis[MAXN];
int dist[MAXN];
void bfs( )
{
memset(dist, 0, sizeof(dist));
while(!que.empty()) que.pop();
vis[src] = 1;
que.push(src);
while(!que.empty())
{
int u = que.front();
que.pop();
for( int i = g[u]; i != -1 ; i = e[i].next)
{
if(e[i].f && !vis[e[i].v])
{
que.push(e[i].v);
dist[e[i].v] = dist[u] + 1;
vis[e[i].v] = 1;
}
}
}
}
int dfs( int u, int delta)
{
if(u == sink)
return delta;
else
{
int ret = 0;
for( int i = g[u]; delta && i!=-1; i = e[i].next)
if(e[i].f && dist[e[i].v] == dist[u] + 1)
{
int dd = dfs(e[i].v, min(e[i].f, delta));
e[i].f -= dd;
e[i^1].f += dd;
delta -= dd;
ret += dd;
}
return ret;
}
}
int maxflow( )
{
int ret = 0;
while(true)
{
memset(vis, 0, sizeof(vis));
bfs();
if(!vis[sink]) return ret;
ret += dfs(src, inf);
}
}
int main()
{
int dnum ,fnum;
while(scanf("%d %d %d",&n, &f, &d)!= EOF)
{
init();
src= 0, sink = 2*n + f+ d+2;
for( int i = 1; i <= f; i++) Addedge(src,i,1);
for( int i = 1; i <= d; i++) Addedge(2*n + f + i, sink, 1);
for( int i = 1; i <= n; i++) Addedge(f + i, f + n + i, 1);
int tem;
for( int i = 1; i <= n; i++)
{
scanf("%d %d",&fnum, &dnum);
for( int j = 1; j <= fnum; j++)
{
scanf("%d",&tem);
Addedge(tem, f + i, 1);
}
for( int j = 1; j <= dnum; j++ )
{
scanf("%d",&tem);
Addedge(i + f + n, 2*n + f + tem,1);
}
}
n = sink + 1;
int res = maxflow();
printf("%d\n",res);
}
return 0;
}