P1402 酒店之王

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;
}

你可能感兴趣的:(P1402 酒店之王)