都说了是‘切’糕所以是最小割咯

建图:

  • 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前层
  • 第i层的每个点向第i+d层的与其相邻点\( \left | x_i-x_{i+d} \right |+\left | y_i-y_{i+d} \right |==1 \)连容量为inf的边,即割断i+d这层以及以下各层需要inf的费用,相当于防止相邻点的\( f(i,j) \)值选择差大于等于d的情况

dinic的dfs不要再写错了

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=45,inf=1e9,D=100005;
int p,q,r,d,s,t,v[N][N][N],id[N][N][N],cnt=1,h[D],le[D];
struct qwe
{
int ne,to,va;
}e[D<<1];
int read()
{
int r=0;
char p=getchar();
while(p>'9'||p<'0')
p=getchar();
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void ins(int u,int v,int w)
{
add(u,v,w);
add(v,u,0);
}
bool bfs()
{
queue<int>q;
memset(le,0,sizeof(le));
le[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(!le[e[i].to]&&e[i].va)
{//cout<<e[i].to<<" "<<le[e[i].to]<<endl;
le[e[i].to]=le[u]+1;//cout<<e[i].to<<" "<<le[e[i].to]<<endl;
q.push(e[i].to);
}
}
return le[t];
}
int dfs(int u,int val)
{
if(u==t)//u==t !!!
return val;
int now=0;
for(int i=h[u];i&&now<val;i=e[i].ne)//now<val !!!
if(le[u]+1==le[e[i].to]&&e[i].va>0)
{
int t=dfs(e[i].to,min(val-now,e[i].va));//val-now !!!
e[i].va-=t;
e[i^1].va+=t;
now+=t;
}
if(!now)
le[u]=-1;
return now;
}
int dinic()
{
int re=0,now;
while(bfs())
while(now=dfs(s,inf))
re+=now;//,cout<<now<<endl;
return re;
}
int main()
{
p=read(),q=read(),r=read(),d=read();
t=p*q*r+1;
for(int i=1;i<=r;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=q;k++)
v[i][j][k]=read(),id[i][j][k]=(i-1)*p*q+(j-1)*q+k;
for(int i=1;i<r;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=q;k++)
ins(id[i][j][k],id[i+1][j][k],v[i][j][k]);
for(int j=1;j<=p;j++)
for(int k=1;k<=q;k++)
ins(s,id[1][j][k],inf);
for(int j=1;j<=p;j++)
for(int k=1;k<=q;k++)
ins(id[r][j][k],t,v[r][j][k]);
for(int i=d+1;i<=r;i++)
for(int j=1;j<=p;j++)
for(int k=1;k<=q;k++)
{
if(j!=1)
ins(id[i][j][k],id[i-d][j-1][k],inf);
if(j!=p)
ins(id[i][j][k],id[i-d][j+1][k],inf);
if(k!=1)
ins(id[i][j][k],id[i-d][j][k-1],inf);
if(k!=q)
ins(id[i][j][k],id[i-d][j][k+1],inf);
}
printf("%d\n",dinic());
return 0;
}

bzoj 3144 [Hnoi2013]切糕【最小割+dinic】的更多相关文章

  1. bzoj 3144: [Hnoi2013]切糕 最小割

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 681  Solved: 375[Submit][Status] ...

  2. bzoj 3144 [Hnoi2013]切糕——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 一根纵轴上切一个点,可以把一根纵轴上的点连成一串来体现.自己的写法是每个点连向前一个点 ...

  3. bzoj3144 [HNOI2013]切糕(最小割)

    bzoj3144 [HNOI2013]切糕(最小割) bzoj Luogu 题面描述见上 题解时间 一开始我真就把这玩意所说的切面当成了平面来做的 事实上只是说相邻的切点高度差都不超过 $ d $ 对 ...

  4. BZOJ 3144: [Hnoi2013]切糕

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1495  Solved: 819[Submit][Status] ...

  5. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

  6. BZOJ3144[Hnoi2013]切糕——最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  7. 【刷题】BZOJ 3144 [Hnoi2013]切糕

    Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...

  8. 【BZOJ3144】[Hnoi2013]切糕 最小割

    [BZOJ3144][Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q ...

  9. Luogu P3227 [HNOI2013]切糕 最小割

    首先推荐一个写的很好的题解,个人水平有限只能写流水账,还请见谅. 经典的最小割模型,很多人都说这个题是水题,但我还是被卡了=_= 技巧:加边表示限制 在没有距离\(<=d\)的限制时候,我们对每 ...

随机推荐

  1. 学习日常笔记<day11>cookie及session

    1.会话管理 1.1会话管理定义 会话管理:管理浏览器客户端和服务端之间的会话过程中产生的会话数据 域对象:实现资源之间的数据共享 request 域对象 context 域对象 1.2.会话技术 C ...

  2. java基础 4 继承(1)抽象类与接口的区别

    抽象类: 是用来捕捉子类的通用特性的,至少包含一个抽象方法,该抽象方法必须在子类中实现,由于抽象类没有抽象方法的具体实现,因此不能对抽象类进行实例化. 接口: 定义了一组方法,是抽象方法的集合,但是接 ...

  3. 文本框变更值触发js事件

    //输入数量更新,不需要失去焦点才触发 $(document).on('input', "input[id^='itemquantity']", function () { sav ...

  4. 中间件序列TDATASET为BUFFER演示代码

    procedure SendStream(const AStream: TStream);var Buffer: array[0..4095] of Byte; // 每包最大4K StartPos, ...

  5. linux的bc命令介绍

    bc命令是一种支持任意精度的交互执行的计算器语言.bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下. 算术操作高级运算bc命令它可以 ...

  6. 电脑控制手机的另一选择——android vnc server

    近来发现的Android上的原生VNC Server,就是说只要手机上安装并运行这个软件,即可实现电脑上查看并控制手机了. 首先是手机端. 1)下载androidvncserver: http://c ...

  7. 【转】面向切面编程-AOP,挺有用的

    原文:http://blog.csdn.net/yangzhihello/article/details/40377399 下面的代码有点问题, ins[methodName] = function( ...

  8. curl -s 不输出统计信息

    curl -s 不输出统计信息 学习了:https://blog.csdn.net/qinyushuang/article/details/44114583

  9. Linux 网络工具

    1 nethogs nethogs 是一个免费的工具,当要查找哪个 PID (注:即 process identifier,进程 ID) 给你的网络流量带来了麻烦时,它是非常方便的.它按每个进程来分组 ...

  10. Word 2013安裝字典

    不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 ...