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

solution

用a[n][m][h]记录不和谐值

建模:

1.将 S 与最底层的点连 一条a[i][j][1] 的边

2.将每一个轴上的每一个点与其上面的点连一条 容量为上一个点不和谐值的边

3.将最上层的点 与 T点连一条 INF 的边

4.最重要的:为了限制  |f(x,y)-f(x1,y1)|<=D 这个条件,我们将每一个点向 与它相邻的 并且比它低D的 点连一条INF的边(当然 没有就不用连了)

证明其正确性:

当两个截点d>D时,还会有增光路

而如果在右边轴上面>D的地方截的话,还会有增广路

而如果在<=D的地方截的话,>D截的点又没有了必要

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<iostream>
  5 #define mem(a,b) memset(a,b,sizeof(a))
  6 #define ll long long
  7 #define dd double
  8 using namespace std;
  9 const int INF=(1<<31)-1;
 10 const int N=2006;
 11 inline int minn(int a,int b){return a<b?a:b;}
 12 struct son
 13 {
 14     int u,v,next;
 15     int w;
 16 };
 17 son a1[3000006];
 18 int first[3000006],e;
 19 void addbian(int u,int v,int w)
 20 {
 21     a1[e].v=v;
 22     a1[e].w=w;
 23     a1[e].u=u;
 24     a1[e].next=first[u];
 25     first[u]=e++;
 26 }
 27 void Link(int u,int v,int w)
 28 {
 29     addbian(u,v,w);
 30     addbian(v,u,0);
 31 }
 32 void Match(int u,int v,int w)
 33 {
 34     addbian(u,v,w);
 35     addbian(v,u,w);
 36 }
 37
 38 int n,m,h,D;
 39 int S,T,ha[46][46][46];
 40 int a[46][46][46];
 41
 42 int dui[1000001],he,en;
 43 inline void clear(){he=1;en=0;}
 44 inline void push(int x){dui[++en]=x;}
 45 inline int top(){return dui[he];}
 46 inline void pop(){++he;}
 47 inline bool empty(){return en>=he?0:1;}
 48
 49 int dep[64666];
 50 int bfs()
 51 {
 52     mem(dep,0);clear();
 53     dep[S]=1;push(S);
 54     while(!empty())
 55     {
 56         int now=top();pop();
 57         for(int i=first[now];i!=-1;i=a1[i].next)
 58         {
 59             int temp=a1[i].v;
 60             if(!a1[i].w||dep[temp])continue;
 61             dep[temp]=dep[now]+1;
 62             push(temp);
 63             if(temp==T)return 1;
 64         }
 65     }
 66     return 0;
 67 }
 68
 69 int dfs(int x,int val)
 70 {
 71     if(x==T)return val;
 72     int val2=val,k;
 73     for(int i=first[x];i!=-1;i=a1[i].next)
 74     {
 75         int temp=a1[i].v;
 76         if(!a1[i].w||dep[temp]!=dep[x]+1||!val2)continue;
 77         k=dfs(temp,minn(val2,a1[i].w));
 78         if(!k){dep[temp]=0;continue;}
 79         a1[i].w-=k;a1[i^1].w+=k;val2-=k;
 80     }
 81     return val-val2;
 82 }
 83
 84 int Dinic()
 85 {
 86     int ans=0;
 87     while(bfs())
 88       ans+=dfs(S,INF);
 89     return ans;
 90 }
 91
 92 int main(){
 93     mem(first,-1);
 94     scanf("%d%d%d",&n,&m,&h);
 95     scanf("%d",&D);
 96     for(int k=1;k<=h;++k)
 97       for(int i=1;i<=n;++i)
 98         for(int j=1;j<=m;++j)
 99         {scanf("%d",&a[i][j][k]);ha[i][j][k]=(k-1)*n*m+(i-1)*m+j;}
100
101     S=0;T=n*m*h+1;
102
103     for(int i=1;i<=n;++i)
104       for(int j=1;j<=m;++j)
105         Link(S,ha[i][j][1],a[i][j][1]);
106
107     for(int k=1;k<h;++k)
108       for(int i=1;i<=n;++i)
109         for(int j=1;j<=m;++j)
110           Link(ha[i][j][k],ha[i][j][k+1],a[i][j][k+1]);
111
112     for(int i=1;i<=n;++i)
113       for(int j=1;j<=m;++j)
114         Link(ha[i][j][h],T,INF);
115
116     for(int k=D;k<=h;++k)
117       for(int i=1;i<=n;++i)
118         for(int j=1;j<=m;++j)
119         {
120                 if(i>1)Link(ha[i][j][k],ha[i-1][j][k-D],INF);
121                 if(i<n)Link(ha[i][j][k],ha[i+1][j][k-D],INF);
122                 if(j>1)Link(ha[i][j][k],ha[i][j-1][k-D],INF);
123                 if(j<m)Link(ha[i][j][k],ha[i][j+1][k-D],INF);
124             }
125
126     printf("%d",Dinic());
127     //while(1);
128     return 0;
129 }

code

转载于:https://www.cnblogs.com/A-LEAF/p/7261274.html

bzoj 3144: [Hnoi2013]切糕相关推荐

  1. BZOJ 3144 [Hnoi2013]切糕

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

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

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

  3. BZOJ.3144.[HNOI2013]切糕(最小割)

    题目链接 没有\(D\)的限制怎么做?"最小"我们可以想到最小割,把同一纵轴上的点串起来,分别连到S,T,最小割就是答案.(在这把点权放到前一条边上) 有限制,即如果要割点\(i\ ...

  4. 3144: [Hnoi2013]切糕

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

  5. ●BOZJ 3144 [Hnoi2013]切糕

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3144 题解: "这是一个经典的最小割模型" ---引用自别人的博客 .. ...

  6. bzoj-3144 [Hnoi2013]切糕

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

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

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

  8. bzoj 3144(最小割)

    传送门 最小割,主要考查建边的思路.本蒟蒻也是看了好几位大佬的博客才看懂.比如: 参考1 参考2 (x,y,z)连接(x,y,z+1)容量为f(x,y,z) (x,y,z)连接(x',y',z-d)容 ...

  9. 切糕(bzoj 3144)

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

最新文章

  1. 在Ubuntu 12.04 64bit上搭建Crtmpserver视频直播服务
  2. c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程
  3. 【树莓派 Raspberry-Pi 】系统安装及一些必要的配置
  4. CCNP-19 IS-IS试验2(BSCI)
  5. stm32 常见错误及原因【持续更新】
  6. c语言水仙花数(输入判断),用c语言判断一个数是否为水仙花数?
  7. 字节内部自动化测试培训资料,明年涨薪用得上
  8. 使用蓝图构建Flask项目目录
  9. 苹果今年将为iPhone采购1.72亿块OLED屏幕 六成用于iPhone 13
  10. 工作的时候用到spring返回xml view查到此文章亲测可用
  11. Citrix Supportability Pack介绍
  12. Pepperl+Fuchs收购德国手持RFID设备提供商Ecom仪器
  13. 因子分析 factor analysis (二 ) : 因子分析模型
  14. 面向后端的前端技术分享
  15. python 实现文字识别提取
  16. matlab清除历史数据,以前在MATLAB中打开过的m文件的历史记录
  17. sql中between and 用法
  18. SIMCOM AT指令大全
  19. 新概念英语1册57课
  20. 云服务器网卡mac地址修改,云服务器 改mac地址吗

热门文章

  1. 双扬:一个非典型前端的成长之路
  2. 云开发平台开箱,3分钟零基础搭建个人Hexo博客
  3. 免费下载 | 全景揭秘阿里文娱智能算法
  4. 趋势发展之人工智能,入行要趁早
  5. 【实施工程师】Linux查看日志后100行
  6. 野史杂谈,西游记令人崩溃的真相
  7. 数据库面试题【十八、优化关联查询优化子查询优化LIMIT分页优化UNION查询优化WHERE子句】
  8. RunTime类,后台快速打开浏览器
  9. C# WPF动画——小游戏
  10. Linux学习笔记--文件夹结构