#include<bits/stdc++.h>
#define int long long
#define mp make_pair
#define ENDL putchar('\n');
#define SPACE putchar(' ');
#define P(x) put(x)
#define R(x) x=read()
using namespace std;
inline int read(){
register int r=0,f=1;register char c=getchar();
while(c>'9'||c<'0'){
if(!(c^'-'))f=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
r=(r<<3)+(r<<1)+(c^'0');
c=getchar();
}
return r*f;
}
inline void put(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
put(x/10);
x%=10;
}
putchar(x^('0'));
return;
}
int n,q,p;
int fir[11451],len=1;
struct b{
int to,nxt,w;
}v[114514];
void add(int x,int y,int w){
// P(x);putchar('-');putchar('>');put(y);
// ENDL
++len;
v[len].to=y;
v[len].nxt=fir[x];
v[len].w=w;
fir[x]=len;
return;
}
int s,t;
int c;
const int inf=1e17;
struct DINIC{
int d[114514]
,fir2[11451];//当前弧优化
int bfs(){
queue<int> q;
q.push(s);
memset(d,-1,sizeof(d));
d[s]=1;
while(!q.empty()){
int nq=q.front();q.pop();
// P(nq);SPACE
if(nq==t)break;
for(int i=fir2[nq];i;fir2[nq]=i=v[i].nxt){
if(v[i].w<=0)continue;
d[v[i].to]=d[nq]+1;
q.push(v[i].to);
}
}
// ENDL
return d[t]^(-1);
}
int dfs(int u,int val){
if(u==t||!val)return val;
int tmp=0;
for(int i=fir2[u];i;fir2[u]=i=v[i].nxt){
if((d[v[i].to]^(1+d[u]))||v[i].w<=0)continue;
int cut=dfs(v[i].to,min(val,v[i].w));
v[i].w-=cut;
v[i^1].w+=cut;
val-=cut;
tmp+=cut;
if(!val)break;
}
if(!tmp)d[u]=-1;
return tmp;
}
int dinic(){
int mincut=0;
memcpy(fir2,fir,sizeof(fir));
while(bfs()){
memcpy(fir2,fir,sizeof(fir));
mincut+=dfs(s,inf);
memcpy(fir2,fir,sizeof(fir));
}
return mincut;
}
}_dinic_;
struct EK{
int lst[114514],f[114514];
int bfs(){
queue<int> q;
q.push(s);
memset(lst,-1,sizeof(lst));
f[s]=inf;
while(!q.empty()){
int nq=q.front();q.pop();
if(nq==t)break;
for(int i=fir[nq];i;i=v[i].nxt){
if((lst[v[i].to]^(-1))||v[i].w<=0)continue;
q.push(v[i].to);
lst[v[i].to]=i;
f[v[i].to]=min(f[nq],v[i].w);
}
}
return lst[t]^(-1);
}
int ek(){
int mincut=0;
while(bfs()){
for(int i=t;i^s;i=v[lst[i]^1].to){
v[lst[i]].w-=f[t];
v[lst[i]^1].w+=f[t];
}
mincut+=f[t];
}
return mincut;
}
}_ek_;
signed main(){
R(n);R(p);R(q);
s=2*n+p+1+q;
t=s+1;
for(int i=1;i<=n;i++){//客人:我裂
add(i,i+n,1);
add(i+n,i,0);
}
for(int i=1;i<=p;i++){//源点连房间
add(s,2*n+i,1);
add(2*n+i,s,0);
}
for(int i=1;i<=q;i++){//饭菜连汇点
add(t,2*n+p+i,0);
add(2*n+p+i,t,1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++){//房间连客人
R(c);
if(!c)continue;
add(2*n+j,i,1);
add(i,2*n+j,0);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=q;j++){//客人连饭菜
R(c);
if(!c)continue;
add(i+n,2*n+p+j,1);
add(2*n+p+j,i+n,0);
}
}
// P(_dinic_.dinic());
P(_ek_.ek());
return 0;
}
P1042为什么我的dinic超时,EK能过