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

建图:

  • 每个点向下一层连容量为这个点的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不要再写错了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=45,inf=1e9,D=100005;
  7. int p,q,r,d,s,t,v[N][N][N],id[N][N][N],cnt=1,h[D],le[D];
  8. struct qwe
  9. {
  10. int ne,to,va;
  11. }e[D<<1];
  12. int read()
  13. {
  14. int r=0;
  15. char p=getchar();
  16. while(p>'9'||p<'0')
  17. p=getchar();
  18. while(p>='0'&&p<='9')
  19. {
  20. r=r*10+p-48;
  21. p=getchar();
  22. }
  23. return r;
  24. }
  25. void add(int u,int v,int w)
  26. {
  27. cnt++;
  28. e[cnt].ne=h[u];
  29. e[cnt].to=v;
  30. e[cnt].va=w;
  31. h[u]=cnt;
  32. }
  33. void ins(int u,int v,int w)
  34. {
  35. add(u,v,w);
  36. add(v,u,0);
  37. }
  38. bool bfs()
  39. {
  40. queue<int>q;
  41. memset(le,0,sizeof(le));
  42. le[s]=1;
  43. q.push(s);
  44. while(!q.empty())
  45. {
  46. int u=q.front();
  47. q.pop();
  48. for(int i=h[u];i;i=e[i].ne)
  49. if(!le[e[i].to]&&e[i].va)
  50. {//cout<<e[i].to<<" "<<le[e[i].to]<<endl;
  51. le[e[i].to]=le[u]+1;//cout<<e[i].to<<" "<<le[e[i].to]<<endl;
  52. q.push(e[i].to);
  53. }
  54. }
  55. return le[t];
  56. }
  57. int dfs(int u,int val)
  58. {
  59. if(u==t)//u==t !!!
  60. return val;
  61. int now=0;
  62. for(int i=h[u];i&&now<val;i=e[i].ne)//now<val !!!
  63. if(le[u]+1==le[e[i].to]&&e[i].va>0)
  64. {
  65. int t=dfs(e[i].to,min(val-now,e[i].va));//val-now !!!
  66. e[i].va-=t;
  67. e[i^1].va+=t;
  68. now+=t;
  69. }
  70. if(!now)
  71. le[u]=-1;
  72. return now;
  73. }
  74. int dinic()
  75. {
  76. int re=0,now;
  77. while(bfs())
  78. while(now=dfs(s,inf))
  79. re+=now;//,cout<<now<<endl;
  80. return re;
  81. }
  82. int main()
  83. {
  84. p=read(),q=read(),r=read(),d=read();
  85. t=p*q*r+1;
  86. for(int i=1;i<=r;i++)
  87. for(int j=1;j<=p;j++)
  88. for(int k=1;k<=q;k++)
  89. v[i][j][k]=read(),id[i][j][k]=(i-1)*p*q+(j-1)*q+k;
  90. for(int i=1;i<r;i++)
  91. for(int j=1;j<=p;j++)
  92. for(int k=1;k<=q;k++)
  93. ins(id[i][j][k],id[i+1][j][k],v[i][j][k]);
  94. for(int j=1;j<=p;j++)
  95. for(int k=1;k<=q;k++)
  96. ins(s,id[1][j][k],inf);
  97. for(int j=1;j<=p;j++)
  98. for(int k=1;k<=q;k++)
  99. ins(id[r][j][k],t,v[r][j][k]);
  100. for(int i=d+1;i<=r;i++)
  101. for(int j=1;j<=p;j++)
  102. for(int k=1;k<=q;k++)
  103. {
  104. if(j!=1)
  105. ins(id[i][j][k],id[i-d][j-1][k],inf);
  106. if(j!=p)
  107. ins(id[i][j][k],id[i-d][j+1][k],inf);
  108. if(k!=1)
  109. ins(id[i][j][k],id[i-d][j][k-1],inf);
  110. if(k!=q)
  111. ins(id[i][j][k],id[i-d][j][k+1],inf);
  112. }
  113. printf("%d\n",dinic());
  114. return 0;
  115. }

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. bit manipulation

    WIKI Bit manipulation is the act of algorithmically manipulating bits or other pieces of data shorte ...

  2. ubuntu 14.04 安装docker,docker-compose

    通过阿里的镜像安装 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | s ...

  3. HDU 6278 主席树(区间第k大)+二分

    Just h-index Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)To ...

  4. POJ 3666 Making the Grade【DP】

    读题堪忧啊,敲完了才发现理解错了..理解题必须看样例啊!! 题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#pro ...

  5. GOF 23种设计模式目录

    经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...

  6. zookeeper原理浅析(二)

    参考:https://www.cnblogs.com/leocook/p/zk_1.html 代码:https://github.com/littlecarzz/zookeeper 1. 数据模型 1 ...

  7. C++ Virtual 关键字

    虚函数是C++中用于多态的机制.核心理念就是通过基类访问派生类定义的函数. 基类的析构含糊都必须是virtual的 虚函数只能借助于指针或者引用来达到多态的效果. 前提B类继承与A类 且foo()为虚 ...

  8. ITIL的考核管理体系

    是的,我们ITIL的考核管理体系,大概是从几个方面进行考核的.阿里巴巴作为一个上市公司,是全球的B2B电子商务的领先者,那么作为我们的运维部,保证完整的可用性是首当其冲的.我们的ITIL考核体系里面, ...

  9. 容器使用笔记(List篇)

    上一篇博客介绍了Dictionary,这篇博客介绍List的相关内容. C#中要存储一组数据.我们会想到数组Array,ArrayList,List这三个对象,当中,数组是最早出现的,我们就从数组開始 ...

  10. 切勿创建包括auto_ptr的容器对象

     当你拷贝一个auto_ptr时,它所指向的对象的全部权被移交到拷入的auto_ptr上,而它自身被置为NULL.我的理解是:拷贝一个auto_ptr意味着改变它的值.比如: auto_ptr&l ...