Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1494  Solved: 818

Description

Input

第一行是三个正整数P,Q,R,表示切糕的长P、 宽Q、高R。第二行有一个非负整数D,表示光滑性要求。接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤P, 1≤y≤Q, 1≤z≤R)。 
100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000。

Output

仅包含一个整数,表示在合法基础上最小的总不和谐值。

Sample Input

2 2 2
1
6 1
6 1
2 6
2 6

Sample Output

6

HINT

最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1

Source

网络流 最小割

从底层到顶层连边,每条(x,y)纵轴成为一条链,其上边的容量等于割掉的花费,S连底层,顶层连T。

利用INF边限制D,求最小割。

http://blog.csdn.net/thy_asdf/article/details/50428973

↑这里讲得挺详细

  1. /*by SilverN*/
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cmath>
  7. #include<queue>
  8. using namespace std;
  9. const int INF=1e9;
  10. const int mx[]={,,,-,};
  11. const int my[]={,,,,-};
  12. const int mxn=;
  13. int read(){
  14. int x=,f=;char ch=getchar();
  15. while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
  16. while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19. struct edge{
  20. int v,nxt,f;
  21. }e[mxn<<];
  22. int hd[mxn],mct=;
  23. void add_edge(int u,int v,int c){
  24. e[++mct].v=v;e[mct].f=c;e[mct].nxt=hd[u];hd[u]=mct;return;
  25. }
  26. void insert(int u,int v,int c){
  27. add_edge(u,v,c);add_edge(v,u,);return;
  28. }
  29. int n,m,S,T;
  30. int P,Q,R;
  31. int w[][][];
  32. int d[mxn];
  33. bool BFS(){
  34. memset(d,,sizeof d);
  35. d[S]=;
  36. queue<int>q;
  37. q.push(S);
  38. while(!q.empty()){
  39. int u=q.front();q.pop();
  40. for(int i=hd[u];i;i=e[i].nxt){
  41. int v=e[i].v;
  42. if(!d[v] && e[i].f){
  43. d[v]=d[u]+;q.push(v);
  44. }
  45. }
  46. }
  47. return d[T];
  48. }
  49. int DFS(int u,int lim){
  50. if(u==T)return lim;
  51. int tmp,f=;
  52. for(int i=hd[u];i;i=e[i].nxt){
  53. int v=e[i].v;
  54. if(d[v]==d[u]+ && e[i].f){
  55. tmp=DFS(v,min(lim,e[i].f));
  56. e[i].f-=tmp;
  57. e[i^].f+=tmp;
  58. lim-=tmp;
  59. f+=tmp;
  60. if(!lim)return f;
  61. }
  62. }
  63. d[u]=;
  64. return f;
  65. }
  66. int Dinic(){
  67. int res=;
  68. while(BFS())res+=DFS(S,1e9);
  69. return res;
  70. }
  71. int id[][][];
  72. void init(){
  73. int cnt=;
  74. for(int x=;x<=P;x++)
  75. for(int y=;y<=Q;y++)
  76. for(int z=;z<=R;z++){
  77. id[x][y][z]=++cnt;
  78. }
  79. return;
  80. }
  81. int main(){
  82. P=read();Q=read();R=read();
  83. int i,j,k,D=read();
  84. init();
  85. S=;T=P*Q*R+;
  86. for(i=;i<=R;i++)//z
  87. for(j=;j<=P;j++)//x
  88. for(k=;k<=Q;k++){//y
  89. w[j][k][i]=read();
  90. }
  91. for(i=;i<=P;i++)//x
  92. for(j=;j<=Q;j++){//y
  93. for(k=;k<=R;k++){//z
  94. insert(id[i][j][k-],id[i][j][k],w[i][j][k]);
  95. if(k>D){
  96. int nx,ny;
  97. for(int l=;l<=;l++){
  98. nx=i+mx[l];
  99. ny=j+my[l];
  100. if(nx< || nx>P || ny< || ny>Q)continue;
  101. insert(id[i][j][k],id[nx][ny][k-D],INF);
  102. }
  103. }
  104. }
  105. insert(id[i][j][R],T,INF);
  106. }
  107. int ans=Dinic();
  108. printf("%d\n",ans);
  109. return ;
  110. }

Bzoj3144 [Hnoi2013]切糕的更多相关文章

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

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

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

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

  3. bzoj千题计划142:bzoj3144: [Hnoi2013]切糕

    http://www.lydsy.com/JudgeOnline/problem.php?id=3144 如果D=2 ,两个点,高度为4,建图如下 #include<queue> #inc ...

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

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

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

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

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3144 分析:神题不解释 http://www.cnblogs.com/zig-zag/ ...

  7. 【BZOJ3144】[HNOI2013]切糕

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

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

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

  9. BZOJ 3144: [Hnoi2013]切糕

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

随机推荐

  1. Linux - expect自动化远程登录脚本

    简单模式: #!/usr/bin/expect -f spawn ssh root@192.168.0.1 expect "*assword*" send "root\r ...

  2. window.frameElement的使用

    window.frameElement的使用: 返回嵌入当前window对象的元素(比如 <iframe> 或者 <object>),如果当前window对象已经是顶层窗口,则 ...

  3. mysql内置函数大全

    mysql 字符串函数用法集合 ASCII(str)返回字符串str的最左面字符的ASCII代码值. mysql> select ascii('d'); +------------+ | asc ...

  4. 我是如何把VC6一直用到2016年的

    写下这个标题的时候,也是表明必须需要改变的时候了…… 黄山松 (Tom Huang) 发表于博客园http://www.cnblogs.com/tomview/ 最早从windows3.1使用vb3编 ...

  5. linux常用系统监控命令

    原文:http://blog.sina.com.cn/s/blog_68f1c17001016uvy.html Linux提供了很多用于监控系统的工具,使用这些工具可以找到导致系统性能降低的瓶颈.系统 ...

  6. linux安装VirualBox虚拟机

    第一步:安装VNC 1. 安装vnc yum install -y tigervnc* 2.启动vncserver [root@xxx ~]# vncserver You will require a ...

  7. Linux吃掉我的内存

    在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能.而当我 ...

  8. oracle 错误代码大全

    oracle错误代码大全(超详细)   ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...

  9. ASP.NET CORE dotnet run 命令使用debug方式运行

    由于我的开发环境比较复杂,每次调试一套项目都要启动好几个VS,比较繁琐,今天决定换一种方式调试,对于不该改动的代码的附加项目直接使用dotnet run命令以debug的运行方式运行, 一开始无法运行 ...

  10. WINDOW的cmd的命令【转载】

    转载地址:https://zhidao.baidu.com/question/583956458.htmlwinver---------检查windows版本 wmimgmt.msc----打开win ...