http://www.lydsy.com/JudgeOnline/problem.php?id=3144

思路:如果没有D的限制,那一个竖轴都是一个最小割,每个点向更高的点引一条流量为自己权值的边,那考虑D的情况,就表明在割i高度这条边的时候,不能割它相邻的i-d以下的任何边,因此,我们引一条边从i高度到相邻的i-d高度,流量为inf,这样就能维护D这个条件了

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<iostream>
  6. #define inf 0x7fffffff
  7. int d[][];
  8. int sz,id[][][],S,T,nodes,P,Q,R,D;
  9. int tot,go[],next[],first[],flow[];
  10. int op[],dis[],cnt[],v[][][];
  11. int read(){
  12. int t=,f=;char ch=getchar();
  13. while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
  14. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  15. return t*f;
  16. }
  17. void insert(int x,int y,int z){
  18. tot++;
  19. go[tot]=y;
  20. next[tot]=first[x];
  21. first[x]=tot;
  22. flow[tot]=z;
  23. }
  24. void add(int x,int y,int z){
  25. insert(x,y,z);op[tot]=tot+;
  26. insert(y,x,);op[tot]=tot-;
  27. }
  28. int dfs(int x,int f){
  29. if (x==T) return f;
  30. int mn=nodes,sum=;
  31. for (int i=first[x];i;i=next[i]){
  32. int pur=go[i];
  33. if (flow[i]&&dis[pur]+==dis[x]){
  34. int F=std::min(f-sum,flow[i]);
  35. int save=dfs(pur,F);
  36. flow[i]-=save;
  37. flow[op[i]]+=save;
  38. sum+=save;
  39. if (sum==f||dis[S]>=nodes) return sum;
  40. }
  41. if (flow[i]) mn=std::min(mn,dis[pur]);
  42. }
  43. if (sum==){
  44. cnt[dis[x]]--;
  45. if (cnt[dis[x]]==) dis[S]=nodes;
  46. else {
  47. dis[x]=mn+;
  48. cnt[dis[x]]++;
  49. }
  50. }
  51. return sum;
  52. }
  53. int main(){
  54. P=read();Q=read();R=read();
  55. D=read();
  56. for (int i=;i<=R+;i++)
  57. for (int j=;j<=P;j++)
  58. for (int k=;k<=Q;k++)
  59. id[i][j][k]=++sz;
  60. S=;T=sz+;nodes=T+;
  61. for (int i=;i<=R;i++)
  62. for (int j=;j<=P;j++)
  63. for (int k=;k<=Q;k++)
  64. v[i][j][k]=read();
  65. for (int j=;j<=P;j++)
  66. for (int k=;k<=Q;k++)
  67. add(S,id[][j][k],inf);
  68. for (int j=;j<=P;j++)
  69. for (int k=;k<=Q;k++)
  70. add(id[R+][j][k],T,inf);
  71. for (int i=;i<=R;i++)
  72. for (int j=;j<=P;j++)
  73. for (int k=;k<=Q;k++)
  74. add(id[i][j][k],id[i+][j][k],v[i][j][k]);
  75. d[][]=d[][]=;d[][]=d[][]=-;
  76. for (int i=;i<=R;i++)
  77. if (i>D)
  78. for (int j=;j<=P;j++)
  79. for (int k=;k<=Q;k++)
  80. for (int l=;l<=;l++){
  81. int dx=j+d[l][],dy=k+d[l][];
  82. if (dx<||dx>P||dy<||dy>Q) continue;
  83. add(id[i][j][k],id[i-D][dx][dy],inf);
  84. }
  85. int ans=;
  86. while (dis[S]<nodes) ans+=dfs(S,inf);
  87. printf("%d\n",ans);
  88. return ;
  89. }

BZOJ3144 切糕的更多相关文章

  1. HNOI2013 BZOJ3144 切糕

    在n×m的表格上,在(x,y)填v的代价是w(x,y,v),且相邻格子填的数相差≤d.求填满表格的最小代价.n,m,maxv≤40. 每个点上选择一个数填,因此将上面的数串起来.考虑限制条件,矛盾条件 ...

  2. 【BZOJ3144】[HNOI2013]切糕

    [BZOJ3144][HNOI2013]切糕 题面 题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑 ...

  3. 【BZOJ3144】切糕(网络流,最小割)

    [BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...

  4. BZOJ3144 Hnoi2013 切糕 【网络流】*

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

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

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

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

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

  7. Bzoj3144 [Hnoi2013]切糕

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1494  Solved: 818 Description Input 第一行是三个正整数P,Q,R,表 ...

  8. 【BZOJ-3144】切糕 最小割-最大流

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

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

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

随机推荐

  1. mysql出现错误“ Every derived table must have its own alias”

    Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时 ...

  2. wordpress提速插件

    auto-remove-googles-url插件,替换前后台国外字体!访问速度有较大提高!可百度搜索auto-remove-googles-url下载,如在wp后台进行插件安装即可

  3. JAVA获取oracle中sequences的最后一个值

    项目中,用到一个序列作单号,框架用的是ssh,在dao层去拿的时候,运行时报错为dual is not mapped,[select *.nextval nextvalue from dual] 后来 ...

  4. hdu 5167 Fibonacci(预处理)

    Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...

  5. animation之translate、scale、alpha、rotate动画效果呈现

    动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...

  6. pyqt一个小例子

    # -*- coding: utf-8 -*- __author__ = 'Administrator' from PyQt4 import Qt,QtCore,QtGui import sys,ra ...

  7. C/C++基础概念

    1.类占用的内存大小: 1)在不同位数的操作系统下,各种数据类型所占用的内存大小:32位和64位操作系统 http://blog.csdn.net/b_zhang/article/details/68 ...

  8. MyEclipse默认编码为GBK,修改为UTF8的方法

    MyEclipse 默认编码居然是GBK,js文件默认编码是ISO-....怎么可以这样呢? 都修改成UTF8的方法: 1.windows->Preferences...打开"首选项& ...

  9. Leetcode_num3_Same Tree

    题目: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  10. windows下删除服务的方法

    删除的办法有两个: 办法一: 用sc.exe这个Windows命令 开始——运行——cmd.exe,然后输入sc就可以看到了.使用办法很简单: sc delete "服务名" (如 ...