题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3144

【分析】

所有人都说这是个经典的最小割模型......蒟蒻泪流满面......

建一个r+1层的,每层都是p*q的图,从源出发向第一层连inf的边,从第r+1层上每个点出发向汇连inf的边,对i,j,k与i,j,k+1之间连v(i,j,k)的边。

如果没有高度限制,那么这么做就是在每一条纵轴上选一个点。

因为有高度限制,所以对于每个层数大于d的点,要向x,y坐标相邻的,层数小d的点连一条inf的边。

以p=1,q=2,r=5,d=2为例。(先忽略从右边较高的点连向左边较低的点的那些边)

下面是源,上面是汇。如图所示,如果我把图中的红边割掉,那么图中的蓝边也就没有用了。如果此时把绿边割掉,那么还是存在一条从源到汇的路径;如果割绿色的边上面的边,那么源到汇就没有路径可达了。

仔细理解一下,也就是在左边选了一条边以后,右边的高度小于当前边的边就不能选了。如果把右上向左下连的边也连起来,那么高度就完全限制住了。

然后跑一下最大流就好了。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxl=45,maxn=75000,maxm=maxn<<4,inf=~0U>>1,mov[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int head[maxn],next[maxm],E[maxm],F[maxm],Ecnt;
int id[maxl][maxl][maxl];
int p,q,r,d;
int s,e;inline void Add_Edge(int x,int y,int f) {next[++Ecnt]=head[x];head[x]=Ecnt;E[Ecnt]=y;F[Ecnt]=0;next[++Ecnt]=head[y];head[y]=Ecnt;E[Ecnt]=x;F[Ecnt]=f;}void Init()
{scanf("%d%d%d%d",&p,&q,&r,&d);int cnt=0,x;Ecnt=1;s=++cnt;for (int i=1;i<=r+1;i++)for (int j=1;j<=p  ;j++)for (int k=1;k<=q  ;k++)id[i][j][k]=++cnt;e=++cnt;for (int i=1;i<=r;i++)for (int j=1;j<=p;j++)for (int k=1;k<=q;k++)scanf("%d",&x),Add_Edge(id[i][j][k],id[i+1][j][k],x);for (int i=1;i<=p;i++)for (int j=1;j<=q;j++)Add_Edge(s,id[1][i][j],inf),Add_Edge(id[r+1][i][j],e,inf);#define nx (j+mov[mv][0])#define ny (k+mov[mv][1])for (int i=d+1;i<=r+1;i++)for (int j=1;j<=p;j++)for (int k=1;k<=q;k++)for (int mv=0;mv<4;mv++)if (id[i][nx][ny])Add_Edge(id[i][j][k],id[i-d][nx][ny],inf);#undef nx#undef ny
}int Q[maxn],Vis[maxn],h[maxn];
bool BFS(int time)
{int top=1,tail=1;Q[1]=s;Vis[1]=time;h[1]=0;while (top<=tail){int x=Q[top++],hx=h[x];for (int i=head[x];i;i=next[i]) if (Vis[E[i]]!=time && F[i^1])h[E[i]]=h[x]+1,Vis[E[i]]=time,Q[++tail]=E[i];if (Vis[e]==time) break;}return Vis[e]==time;
}int DFS(int x,int f)
{if (x==e) return f;int res=f;for (int i=head[x];i && res;i=next[i]) if (h[E[i]]==h[x]+1 && F[i^1]){int d=DFS(E[i],min(F[i^1],res));res-=d;F[i]+=d;F[i^1]-=d;}if (f==res) h[x]=-1;return f-res;
}void Dinic()
{int res=0,time=0;while (BFS(++time)) res+=DFS(s,inf);printf("%d\n",res);
}int main()
{Init();Dinic();return 0;
}

BZOJ3144【HNOI2013】切糕相关推荐

  1. bzoj-3144 [Hnoi2013]切糕

    3144 [Hnoi2013]切糕 题目链接 题目大意 给出一个立方体(长宽高分别P,Q,R),按三维坐标每个点记作(x,y,z),点权为V(x,y,z),对于x,y位置从上到下有z层,但只能选择一层 ...

  2. bzoj3144: [Hnoi2013]切糕(最小割)

    传送门 据说这玩意儿叫切糕模型? 我们可以看做有$P*Q$个网格,每个格子有$R$个点,在每一个格子中选一个点,且相邻的点距离不能超过$d$,求最小代价 考虑如果没有限制条件怎么做.我们可以把每一个网 ...

  3. bzoj3144 [Hnoi2013]切糕

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

  4. BZOJ3144: [Hnoi2013]切糕

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3144 把每一条z轴都拿出来,s->(x,y,1),c=f[x][y][1];(x,y,k ...

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

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

  6. BZOJ 3144 [Hnoi2013]切糕

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

  7. 3144: [Hnoi2013]切糕

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1526  Solved: 827 [Submit][Statu ...

  8. [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  9. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)

    题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...

  10. bzoj 3144: [Hnoi2013]切糕

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

最新文章

  1. 兵棋推演有助于我们了解哪些战争知识?
  2. 异或方式找到一组数组中不重复的两个数(同班同学方法)
  3. 第 10 章 建造者模式【Builder Pattern】
  4. 阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记
  5. Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend)问题的解决
  6. Kotlin入门(24)如何自定义视图
  7. Linux 命令(92)—— locate 命令
  8. 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身
  9. 颜色及图片识别原理,颜色识别传感器介绍
  10. 智能制造-从愿景到实现路径
  11. IE浏览器假死解决办法
  12. 服务器装xp系统蓝屏怎么办,安装XP系统出现蓝屏的解决办法
  13. 项目产品化的版本管控实践方案
  14. Uedit32设置字体大小
  15. 测试公开课资料系列02--Postman之chai.js断言应用
  16. 批量修改linux服务器密码,Linux下批量修改服务器用户密码方法步骤
  17. 基于android7.0源码修改
  18. Android 响铃与震动模式的
  19. android电视投影ipad,【沙发管家】苹果手机, Ipad连接安卓智能电视投屏教程!
  20. 团队管理的五大核心 | 管理者必读

热门文章

  1. WFC 就是wifi calling、vowifi
  2. 管理软件实施(6)——售前都是细节偏执狂
  3. 考研人常说的“死亡211”和“984.5”是什么学校?
  4. 微生物组-宏基因组分析专题技术研讨会(2023.4)
  5. 合肥工业大学嵌入式系统原理实验报告
  6. 企业选择在线客服系统时需要注意什么?
  7. 玩转华为ENSP模拟器系列 | 配置LDP本地会话的定时器
  8. Software Architecture: The Hard Parts Modern Trade-Off Analyses for Distributed Architectures学习笔记
  9. Python简易web静态服务器程序搭建
  10. 关于海康威视录像回放功能文件搜索失败问题