P1402ホテルキング(ネットワークフローポイント解体工事図)

#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();
}

 

おすすめ

転載: blog.csdn.net/qq_42129242/article/details/90063626