P1402 酒店之王
和这题思路一模一样。我的题解
其余不多说了,直接上代码
#include
using namespace std;
const int inf=1000000007;
const int N=605;
const int M=1200005;
#define mx (n+p+q)
int n,p,q,s,t,maxflow;
int head[N],num_edge=1,cur[N],dep[N];
bool inq[N];
vectorg[N];
struct edge {
int nxt,val,to;
} e[M<<1];
void add(int from,int to,int val) {
++num_edge;
e[num_edge].nxt=head[from];
e[num_edge].to=to;
e[num_edge].val=val;
head[from]=num_edge;
}
bool bfs() {
for(int i=1; i<=t; ++i)
inq[i]=false,cur[i]=head[i],dep[i]=inf;
queueq;
q.push(s);
dep[s]=0;
inq[s]=true;
while(!q.empty()) {
int u=q.front();
q.pop();
inq[u]=false;
for(int i=head[u]; i; i=e[i].nxt) {
int v=e[i].to;
if(dep[v]>dep[u]+1&&e[i].val) {
dep[v]=dep[u]+1;
if(!inq[v]) {
q.push(v);
inq[v]=true;
}
}
}
}
return dep[t]!=inf;
}
int dfs(int u,int flow) {
if(u==t) {
maxflow+=flow;
return flow;
}
int used=0,rlow;
for(int i=cur[u]; i; i=e[i].nxt) {
cur[u]=i;
int v=e[i].to,w=e[i].val;
if(w&&dep[v]==dep[u]+1) {
rlow=dfs(v,min(flow-used,w));
if(rlow) {
used+=rlow;
e[i].val-=rlow;
e[i^1].val+=rlow;
if(used==flow)break;
}
}
}
return used;
}
void dinic() {
while(bfs())dfs(s,inf);
}
int main() {
scanf("%d%d%d",&n,&p,&q);
s=2*n+p+q+1;
t=2*n+p+q+2;
for(int i=1; i<=p; ++i)
add(s,i,1),add(i,s,0);
for(int i=1;i<=n;++i)
add(p+i,i+mx,1),add(i+mx,p+i,0);
for(int i=1;i<=q;++i)
add(n+p+i,t,1),add(t,n+p+i,0);
for(int i=1; i<=n; ++i) {
for(int j=1,tmp; j<=p; ++j) {
scanf("%d",&tmp);
if(tmp) {
add(j,i+p,1);
add(i+p,j,0);
}
}
}
for(int i=1; i<=n; ++i) {
for(int j=1,tmp;j<=q;++j) {
scanf("%d",&tmp);
if(tmp) {
add(i+mx,j+n+p,1);
add(j+n+p,i+mx,0);
}
}
}
dinic();
printf("%d\n",maxflow);
return 0;
}