记录编号 431034 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [HNOI 2013]切糕 最终得分 100
用户昵称 GravatarHzoi_Maple 是否通过 通过
代码语言 C++ 运行时间 0.358 s
提交时间 2017-07-31 07:55:11 内存使用 10.87 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 500000
const int T=64001;
const int S=0;
int n,m,num;
int adj[100000];
struct flow{
	int s,t,w,next;	
}k[1000000];
int read(){
	int sum=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return sum;
}
void init(int s,int t,int w){
	k[num].s=s;k[num].t=t;k[num].w=w;
	k[num].next=adj[s];adj[s]=num++;
}
int p,f,r,d,cnt,sum;
int w[41][41][41],id[41][41][41];
int dp[64002];
bool bfs(){
	memset(dp,0,sizeof(dp));
	queue<int>q;dp[S]=1;q.push(S);
	while(!q.empty()){
		int o=q.front();q.pop();
		for(int i=adj[o];i!=-1;i=k[i].next){
			if(!k[i].w||dp[k[i].t]) continue;
			dp[k[i].t]=dp[o]+1;
			if(k[i].t==T) return true;
			q.push(k[i].t);
		}	
	}
	return false;
}
int dfs(int o,int fw){
	if(o==T) return fw;
	int tmp=fw,s;
	for(int i=adj[o];i!=-1;i=k[i].next){
		if(!k[i].w||!tmp||dp[k[i].t]!=dp[o]+1) continue;
		s=dfs(k[i].t,min(tmp,k[i].w));
		if(!s){
			dp[k[i].t]=0;continue;
		}
		k[i].w-=s;k[i^1].w+=s;tmp-=s;
	}
	return fw-tmp;
}
int main(){
	freopen("nutcake.in","r",stdin);
	freopen("nutcake.out","w",stdout);
	memset(adj,-1,sizeof(adj));
	p=read();f=read();r=read();
	d=read();
	for(int i=1;i<=r;++i){
		for(int j=1;j<=p;++j)
			for(int u=1;u<=f;++u){
				w[i][j][u]=read();sum+=w[i][j][u];
				id[i][j][u]=++cnt;
				init(id[i-1][j][u],id[i][j][u],w[i][j][u]);
				init(id[i][j][u],id[i-1][j][u],0);
				if(i==r)
					init(id[i][j][u],T,inf),init(T,id[i][j][u],0);
				if(i>d){
					if(j<p)
						init(id[i][j][u],id[i-d][j+1][u],inf),init(id[i-d][j+1][u],id[i][j][u],0);
					if(j>1)
						init(id[i][j][u],id[i-d][j-1][u],inf),init(id[i-d][j-1][u],id[i][j][u],0);
					if(u<f)
						init(id[i][j][u],id[i-d][j][u+1],inf),init(id[i-d][j][u+1],id[i][j][u],0);
					if(u>1)
						init(id[i][j][u],id[i-d][j][u-1],inf),init(id[i-d][j][u-1],id[i][j][u],0);			
				}
			}
	}
	int ans=0;
	while(bfs())
		ans+=dfs(S,inf);
	printf("%d\n",ans);
	// while(1);
	return 0;
}