#include<bits/stdc++.h>
using namespace std;
const int N = 1100;
const int inf = 0x3f3f3f3f;
int n,p,q,S,T,tot;
int en=1,head[N],h[N],Q[N];
struct edge{
int to,v,next;
}e[N*10];
inline void insert(int u,int v,int f){
e[++en].to=v;e[en].v=f;e[en].next=head[u];head[u]=en;
e[++en].to=u;e[en].v=0;e[en].next=head[v];head[v]=en;
}
inline int dfs(int x,int f){
if(x==T) return f;
int w,used=0;
for(int i=head[x];i;i=e[i].next){
int v = e[i].to;
if(h[v]==h[x]+1&&e[i].v){
w = dfs(v,min(f-used,e[i].v));
e[i].v-=w;
e[i^1].v+=w;
used+=w;
if(used==f) return f;
}
}
if(!used) h[x]=-1;
return used;
}
inline int bfs()
{
int f=0,t=0;
memset(h,-1,sizeof h);
Q[t++]=S;h[S]=0;
while(f<t){
int now = Q[f++];
for(int i=head[now];i;i=e[i].next){
int v = e[i].to;
if(h[v]==-1&&e[i].v){
h[v] = h[now]+1;
Q[t++]=v;
}
}
}
if(h[T]==-1) return 0;
return 1;
}
inline void dinic(){
while(bfs()) tot+=dfs(S,inf);
printf("%d\n",tot);
}
int main()
{
scanf("%d%d%d",&n,&p,&q);
S=0,T=500;
for(int i=1;i<=p;++i) insert(S,i,1);
for(int i=p+1;i<=p+q;++i) insert(i,T,1);
for(int i=p+q+1;i<=n+p+q;++i) insert(i,i+n,1);
for(int i=p+q+1;i<=n+p+q;++i){
int x;
for(int j=1;j<=p;++j){
scanf("%d",&x);
if(x)insert(j,i,1);
}
}
for(int i=p+q+1;i<=n+p+q;++i){
int x;
for(int j=1;j<=q;++j){
scanf("%d",&x);
if(x)insert(i+n,j+p,1);
}
}
dinic();
}
P1402 酒店之王(网络流拆点建图)
猜你喜欢
转载自blog.csdn.net/qq_42129242/article/details/90063626
今日推荐
周排行