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. SE_homework1(第一部分)

        题目:写一个能自动生成小学四则运算题目的命令行"软件",分别满足下列各种需求.下面这些需求都可以用命令行参数的形式来指定: a.)除了整数以外,还支持真分数的运算.(例如1 ...

  2. Oracle Linux(64位)安装64位Oracle10g遇到ins_ctx.mk问题

    在Oracle Linux Server Release 5.7上安装64位Oracle 10g 时,遇到如下问题: Error in invoking target 'install' of mak ...

  3. nginx 301 永久重定向

    nginx301跳转设置很简单,配置如下. (配置文件默认为nginx.conf,如果制定了新的配置文件,在新的文件配置即可.) server{ server_name xxx.com www.xxx ...

  4. SDN:motivation

    今天公交车上看了会SDN一本介绍性的书籍,具体名字不记得了.我想,我已经在实验室呆了很久的时间的,接触SDN也有一段时间了.对SDN的一些基本的知识还是需要好好整理一番.当然,这里只是一个随笔,想到什 ...

  5. makefile 学习笔记

    1/ 编写简单makefile test_out: test.o g++ test.o -o test_out test.o: test.cpp test.h g++ -c test.cpp test ...

  6. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

  7. android第一行代码-6.自定义控件的实现

    0.假设一个应用中标题栏控件都是共用的,如果每个activity都需要设置button,绑定方法,那代码就会很臃肿.那我们可以自定义控件,然后继承这个控件就行了. 自定义控件为TitleLayout, ...

  8. JSHint配置项说明

    转自:http://www.jianshu.com/p/4cb23f9e19d3 什么是JSHint? 官方网站这样介绍: JSHint, A Static Code Analysis Tool fo ...

  9. ThinkPHP常用查询

    1.常规 $map2['state'] = 1; $User->where ( $map2 )->find(); 2. OR 查询 $where['name'] = array('neq' ...

  10. 记录android显示流程

    mtk平台: displayclient->deque->数据放入显存->surfaceflinger->分发数据到surfacetexture(OnFrameAvailabl ...