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

建图:

  • 每个点向下一层连容量为这个点的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. ***iOS学习之Table View的简单使用和DEMO示例(共Plain普通+Grouped分组两种)

    Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View ...

  2. Codeforces 659B Qualifying Contest【模拟,读题】

    写这道题题解的目的就是纪念一下半个小时才读懂题...英文一多读一读就溜号... 读题时还时要静下心来... 题目链接: http://codeforces.com/contest/659/proble ...

  3. 包装类Float中为什么有两个常量来表示最小值

    1)问:包装类Float中为什么有两个常量来表示最小值:MIN_VALUE和MIN_NORMAL ① MIN_VALUE:最小正非零值常量,是非规格化浮点数所能表示的最小值.值为 3.4E-45 的常 ...

  4. SpringDataJPA入门2

    SpringDataJPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系型数据库的映射,此类Java对象成为JPA实体或简称实体.实体通常与底层数据库中的单个关系表相关联 ...

  5. “约定优于配置”与Magento改造尝试四之block、helper和model载入

    暂定本章为这个系列最后一章,还是继续沿用模块的别名(alias)概念 <modules> <Mage_Wishlist> <version>1.6.0.0</ ...

  6. Spring之IOC篇章具体解释

    专题一   IOC 1.接口以及面向接口编程 a.结构设计中,分清层次以及调用关系,每层仅仅向外(或者上层)提供一组功能接口,各层间仅依赖接口而非实现类这样做的优点是,接口实现的变动不影响各层间的调用 ...

  7. 【Mongodb教程 第七课 】MongoDB 查询文档

    find() 方法 要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法. 语法 基本的find()方法语法如下 >db.COLLECTION_NAME.find() ...

  8. LoadRunner---http请求中对中文参数的处理

    Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...

  9. centos7 安装配置openstack-dashboard (官网openstack-juno版)

    感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免.欢迎指正! 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  10. JQuery实现表格行的上移、下移、删除、增加

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%&g ...