Description
题解:
又被tkjD飞!边写博客边被D!就乱搞一下,然后注意一下如何满足限制就行了。做这题还是挺有收获的。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int Maxn=65000;
const int inf=2147483647;
int h[Maxn],st,ed,P,Q,R,D;
struct Edge{int y,d,next;}e[2110000];
int len=1,last[Maxn];
void ins(int x,int y,int d)
{
int t=++len;
e[t].y=y;e[t].d=d;
e[t].next=last[x];last[x]=t;
}
void addedge(int x,int y,int d){ins(x,y,d);ins(y,x,0);}
bool bfs()
{
queue<int>q;
memset(h,0,sizeof(h));h[st]=1;
q.push(st);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=last[x];i;i=e[i].next)
if(e[i].d&&!h[e[i].y])h[e[i].y]=h[x]+1,q.push(e[i].y);
}
return h[ed];
}
int dfs(int x,int f)
{
if(x==ed)return f;
int s=0,t;
for(int i=last[x];i;i=e[i].next)
{
int y=e[i].y;
if(h[y]==h[x]+1&&e[i].d&&s<f)
{
t=dfs(y,min(f-s,e[i].d));
s+=t;e[i^1].d+=t;e[i].d-=t;
}
}
if(s==0)h[x]=0;
return s;
}
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int num[42][42][42],z=0;
int tx[]={1,-1,0,0};
int ty[]={0,0,1,-1};
int main()
{
P=read();Q=read();R=read();D=read();
for(int i=1;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)
num[i][j][k]=++z;st=z+1;ed=z+2;
for(int i=1;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)
{
if(i==1)addedge(st,num[i][j][k],inf);
if(i==R)addedge(num[i][j][k],ed,read());
else addedge(num[i][j][k],num[i+1][j][k],read());
}
for(int i=D+1;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)
for(int l=0;l<4;l++)
{
int nx=j+tx[l],ny=k+ty[l];
if(nx&&ny&&nx<=P&&ny<=Q)
addedge(num[i][j][k],num[i-D][nx][ny],inf);
}
int ans=0;
while(bfs())ans+=dfs(st,inf);
printf("%d",ans);
}