求助 70pts #8#9#10 WA
  • 板块P1402 酒店之王
  • 楼主ZeroF
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/1/10 17:07
  • 上次更新2023/10/24 04:52:06
查看原帖
求助 70pts #8#9#10 WA
385165
ZeroF楼主2023/1/10 17:07
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int to,next,flow;
}edge[100000010];
int head[210],dep[210],tot=1,s,t;
void add(int from,int to,int flow){
	edge[++tot].to=to,edge[tot].next=head[from],edge[tot].flow=flow,head[from]=tot;
	edge[++tot].to=from,edge[tot].next=head[to],edge[tot].flow=0,head[to]=tot;
}
bool bfs(){
	memset(dep,0,sizeof(dep));
	queue<int>q;
	q.push(s),dep[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].to,f=edge[i].flow;
			if(dep[v]==0&&f>0){
				q.push(v);
				dep[v]=dep[u]+1;
				if(v==t)return true;
			}
		}
	}
	return false;
}
int dfs(int u,int flow){
	if(u==t){
		return flow;
	}
	int rest=flow;
	for(int i=head[u];i&&rest;i=edge[i].next){
		int v=edge[i].to,f=edge[i].flow;
		if(dep[v]==dep[u]+1&&f>0){
			int ff=dfs(v,min(rest,f));
			if(ff==0)dep[v]=0;
			rest-=ff;
			edge[i].flow-=ff;
			edge[i^1].flow+=ff;
		}
	}
	return flow-rest;
}
int Dinic(){
	int mxf=0,flow;
	while(bfs()){
		while(flow=dfs(s,2*1e9)){
			mxf+=flow;
		}
	}
	return mxf;
}
int main(){
	s=1;
	int n,p,q;
	cin>>n>>p>>q;
	t=2+2*n+p+q;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=p;j++){
			int px;
			cin>>px;
			if(px==1)add(j+1,p+1+i,1);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=q;j++){
			int qx;
			cin>>qx;
			if(qx==1)add(1+n+p+i,j+1+2*n+p,1);
		}
	}
	for(int i=1;i<=p;i++){
		add(s,1+i,1);
	}
	for(int i=1;i<=q;i++){
		add(1+p+2*n+i,t,1);
	}
	for(int i=1;i<=n;i++){
		add(1+p+i,1+p+n+i,1);
	}
	cout<<Dinic()<<endl;
	return 0;
}
2023/1/10 17:07
加载中...