题目链接

每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\)。

这样就得到了\(P*Q\)条链,不考虑\(D\)的限制的话求最小割就是答案。

现在加入限制。记结论吧,我也不知道什么原理

每个位置从\(i=D+1\)层开始,向他前后左右第\(i-D\)层连边,流量\(INF\)。

然后求出最小割即为答案。

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #define INF 2147483647
  5. using namespace std;
  6. const int MAXN = 900010;
  7. const int MAXM = 2000010;
  8. inline int read(){
  9. int s = 0, w = 1;
  10. char ch = getchar();
  11. while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
  12. while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
  13. return s * w;
  14. }
  15. struct Edge{
  16. int next, to, rest;
  17. }e[MAXM];
  18. int s, t, num = 1, n, m, a, b, c, p, q, r, d, f[45][45][45];
  19. int head[MAXN];
  20. inline void Add(int from, int to, int flow){
  21. e[++num] = (Edge){ head[from], to, flow }; head[from] = num;
  22. e[++num] = (Edge){ head[to], from, 0 }; head[to] = num;
  23. }
  24. int level[MAXN], now, sum;
  25. queue <int> Q;
  26. int re(){
  27. memset(level, 0, sizeof level);
  28. while(Q.size()) Q.pop();
  29. Q.push(s); level[s] = 1;
  30. while(Q.size()){
  31. now = Q.front(); Q.pop();
  32. for(int i = head[now]; i; i = e[i].next)
  33. if(e[i].rest && !level[e[i].to]){
  34. level[e[i].to] = level[now] + 1;
  35. Q.push(e[i].to);
  36. }
  37. }
  38. return level[t];
  39. }
  40. int findflow(int u, int flow){
  41. if(!flow || u == t) return flow;
  42. int f = 0, t;
  43. for(int i = head[u]; i; i = e[i].next){
  44. if(e[i].rest && level[e[i].to] == level[u] + 1){
  45. f += (t = findflow(e[i].to, min(flow - f, e[i].rest)));
  46. e[i].rest -= t; e[i ^ 1].rest += t;
  47. }
  48. }
  49. if(!f) level[u] = 0;
  50. return f;
  51. }
  52. int dinic(){
  53. int ans = 0;
  54. while(re())
  55. ans += findflow(s, INF);
  56. return ans;
  57. }
  58. int id(int k, int i, int j){
  59. if(!k) return s;
  60. return (k - 1) * (p * q) + (i - 1) * q + j;
  61. }
  62. int L[] = {233, -1, 1, 0, 0}, R[] = {666, 0, 0, -1, 1};
  63. int main(){
  64. p = read(); q = read(); r = read(); d = read();
  65. s = 899999; t = 900000;
  66. for(int i = 1; i <= p; ++i)
  67. for(int j = 1; j <= q; ++j)
  68. Add(id(r, i, j), t, INF);
  69. for(int k = 1; k <= r; ++k)
  70. for(int i = 1; i <= p; ++i)
  71. for(int j = 1; j <= q; ++j)
  72. Add(id(k - 1, i, j), id(k, i, j), read());
  73. for(int i = 1; i <= p; ++i)
  74. for(int j = 1; j <= q; ++j)
  75. for(int k = 1; k <= 4; ++k){
  76. int x = i + L[k], y = j + R[k];
  77. if(!x || !y || x > p || y > q) continue;
  78. for(int o = d + 1; o <= r; ++o)
  79. Add(id(o, i, j), id(o - d, x, y), INF);
  80. }
  81. printf("%d\n", dinic());
  82. return 0;
  83. }

【洛谷 P3227】 [HNOI2013]切糕(最小割)的更多相关文章

  1. 洛谷 P3227 [HNOI2013]切糕(最小割)

    题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...

  2. [洛谷P3227][HNOI2013]切糕

    题目大意:有一个$n\times m$的切糕,每一个位置的高度可以在$[1,k]$之间,每个高度有一个代价,要求四联通的两个格子之间高度最多相差$D$,问可行的最小代价.$n,m,k,D\leqsla ...

  3. Luogu P3227 [HNOI2013]切糕 最小割

    首先推荐一个写的很好的题解,个人水平有限只能写流水账,还请见谅. 经典的最小割模型,很多人都说这个题是水题,但我还是被卡了=_= 技巧:加边表示限制 在没有距离\(<=d\)的限制时候,我们对每 ...

  4. 洛谷$P3227\ [HNOI2013]$切糕 网络流

    正解:网络流 解题报告: 传送门! 日常看不懂题系列,,,$QAQ$ 所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$ ...

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

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

  6. bzoj 3144: [Hnoi2013]切糕 最小割

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

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

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

  8. 【洛谷P3329】 [ZJOI2011]最小割(最小割树)

    洛谷 题意: 给出一个无向图,之后有\(q,q\leq 30\)组询问,每组询问有一个\(x\),回答有多少点对\((a,b)\)其\(a-b\)最小割不超过\(x\). 思路: 这个题做法要最小割树 ...

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

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

  10. bzoj 3144 [Hnoi2013]切糕——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 一根纵轴上切一个点,可以把一根纵轴上的点连成一串来体现.自己的写法是每个点连向前一个点 ...

随机推荐

  1. bootstrap心得

    最近在弄个人的博客,之前对bootstrap的使用老是感觉使用的一般 幸好在看了慕课网的一个老师的实例教程之后,才感觉是真正对前端使用bootstrap有了一点理解 首先就是. 这些标签,其实都是相当 ...

  2. py27使用redis

    1.安装redis pip install redis 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/

  3. MySQL专题 2 数据库优化 Slow Query log

    MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志,记录 mysqld 的 ...

  4. java面试及答案

    优秀总结博客 mybatis总结 java并发包相关 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. hashmap3.反射中,Class. ...

  5. BZOJ1176:[Balkan2007]Mokia——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1176 Description(题面本人自行修改了一下) 维护一个W*W的矩阵,初始值均为0.每次操作 ...

  6. 菜鸟在线教你用Unity3D开发VR版的Hello World

    大家好,我是菜鸟在线的小编.这篇短文将告诉大家如何用Unity3D开发VR版的Hello World. 1开启SteamVR并连接Vive设备 (a)登录Steam客户端,并点击右上角的VR按钮,这时 ...

  7. 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...

  8. linux top命令查看系统资源

    参考材料: http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html

  9. 基础学习笔记之opencv(24):imwrite函数的使用

    http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...

  10. BMP格式图像读取与存储

    全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...