bzoj3144 [HNOI2013]切糕(最小割)

bzoj Luogu

题面描述见上

题解时间

一开始我真就把这玩意所说的切面当成了平面来做的

事实上只是说相邻的切点高度差都不超过 $ d $

对于一条 $ z $ 轴方向的线,把原题的点看成边,每个原题的点两端看成两个点就好(就是说一条线上有 $ r+1 $ 个点 $ r $ 条边),底端每一个点有一条由 $ S $ 连向它的不能断开( $ inf $ )的边,顶端每个点同理连向 $ T $

之后考虑处理相邻两点之间高度差不超过 $ d $

假设我们已经选了线 $ l_1 $ 上的一个原图点 $ p_1 $,那么与之相邻的一条线 $ l_2 $ 上选择的原图点 $ p_2 $ 纵坐标必须在一个区间内

从 $ p_1 $ 两端向 $ p_2 $ 可选范围两端连不能断开( $ inf $ )的边就行

然后直接跑最小割。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<typename TP>inline void read(TP &tar)
  4. {
  5. TP ret=0,f=1;char ch=getchar();
  6. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
  8. tar=ret*f;
  9. }
  10. namespace LarjaIX
  11. {
  12. const int N=70011,M=1000011,inf=0x3f3f3f3f;
  13. struct sumireko{int to,ne,w;}e[M<<1];int he[N],ecnt=1;
  14. void addline(int f,int t,int w)
  15. {
  16. e[++ecnt].to=t,e[ecnt].w=w;
  17. e[ecnt].ne=he[f],he[f]=ecnt;
  18. e[++ecnt].to=f,e[ecnt].w=0;
  19. e[ecnt].ne=he[t],he[t]=ecnt;
  20. }
  21. int head[N],dep[N];bool ins[N];
  22. queue<int> qu;
  23. bool bfs(int sp,int ep)
  24. {
  25. memcpy(head,he,sizeof(head));
  26. memset(dep,0x3f,sizeof(dep));
  27. dep[sp]=1,ins[sp]=1,qu.push(sp);
  28. while(!qu.empty())
  29. {
  30. int x=qu.front();qu.pop();ins[x]=0;
  31. for(int ei=he[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
  32. if(e[ei].w&&dep[t]>dep[x]+1)
  33. {
  34. dep[t]=dep[x]+1;
  35. if(!ins[t]) qu.push(t),ins[t]=1;
  36. }
  37. }
  38. return dep[ep]!=inf;
  39. }
  40. int dfs(int x,int lim,int ep)
  41. {
  42. if(x==ep||!lim) return lim;
  43. int ret=0,tmp=0;
  44. for(int ei=head[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
  45. {
  46. head[x]=ei;
  47. if(dep[t]==dep[x]+1) if(tmp=dfs(t,min(lim,e[ei].w),ep))
  48. {
  49. lim-=tmp,ret+=tmp;
  50. e[ei].w-=tmp,e[ei^1].w+=tmp;
  51. }
  52. }
  53. return ret;
  54. }
  55. int dinic(int sp,int ep)
  56. {
  57. int ret=0;
  58. while(bfs(sp,ep))
  59. ret+=dfs(sp,inf,ep);
  60. return ret;
  61. }
  62. int p,q,r,d,a[44][44][44],id[44][44][44],ic,S,E;
  63. int maid()
  64. {
  65. read(p),read(q),read(r),read(d);
  66. for(int z=1;z<=r;z++)for(int x=1;x<=p;x++)for(int y=1;y<=q;y++) read(a[x][y][z]);
  67. r++;
  68. for(int x=1;x<=p;x++)for(int y=1;y<=q;y++)for(int z=1;z<=r;z++) id[x][y][z]=++ic;S=++ic,E=++ic;
  69. for(int x=1;x<=p;x++)for(int y=1;y<=q;y++)
  70. {
  71. addline(S,id[x][y][1],inf),addline(id[x][y][r],E,inf);
  72. for(int z=1;z<r;z++)
  73. {
  74. addline(id[x][y][z],id[x][y][z+1],a[x][y][z]);
  75. if(x+1<=p) addline(id[x][y][z],id[x+1][y][max(1,z-d)],inf),addline(id[x+1][y][min(r,z+1+d)],id[x][y][z+1],inf);
  76. if(x-1) addline(id[x][y][z],id[x-1][y][max(1,z-d)],inf),addline(id[x-1][y][min(r,z+1+d)],id[x][y][z+1],inf);
  77. if(y+1<=q) addline(id[x][y][z],id[x][y+1][max(1,z-d)],inf),addline(id[x][y+1][min(r,z+1+d)],id[x][y][z+1],inf);
  78. if(y-1) addline(id[x][y][z],id[x][y-1][max(1,z-d)],inf),addline(id[x][y-1][min(r,z+1+d)],id[x][y][z+1],inf);
  79. }
  80. }
  81. printf("%d\n",dinic(S,E));
  82. return 0;
  83. }
  84. }
  85. int main(){return LarjaIX::maid();}

bzoj3144 [HNOI2013]切糕(最小割)的更多相关文章

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

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

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

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

  3. 【BZOJ-3144】切糕 最小割-最大流

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

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

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

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

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

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

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

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

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

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

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

  9. BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型

    问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...

随机推荐

  1. Solution -「Gym 102759I」Query On A Tree 17

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,结点 \(1\) 为根,点 \(u\) 初始有点权 \(a_u=0\),维护 \(q\) 次 ...

  2. pytest(12)-Allure常用特性allure.attach、allure.step、fixture、environment、categories

    上一篇文章pytest Allure生成测试报告我们学习了Allure中的一些特性,接下来继续学习其他常用的特性. allure.attach allure.attach用于在测试报告中添加附件,补充 ...

  3. 跟Excel说拜拜,这款可视化报表制作工具入股不亏!

    ​相信很多人如果看到漂亮的图表都会很感叹,"为什么可以做的这么漂亮,这么好看?","这个应该怎么做呢?用什么工具可以实现呢?".制作漂亮的可视化一般有这样几个方 ...

  4. Weisfeiler-Lehman(WL) 算法和WL Test

    Weisfeiler-Lehman 算法 很多论文中会讲,从另一个角度来讲,GCN模型可以看作图上非常有名的 Weisfeiler-Lehman 算法的一种变形.那么什么是 Weisfeiler-Le ...

  5. Windows11中如何使用旧版本IE浏览器打开网页

    Windows11删除了旧版本IE浏览器,完全采用了Edge,但是我们进行网站测试时有时仍会用到IE浏览器,那么可以按照以下步骤启用: 1.进入Edge浏览器中,打开设置,进入默认浏览器选项下: 修改 ...

  6. (第一章第六部分)TensorFlow框架之实现线性回归小案例

    系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html (二)TensorFlow框架之图与Tensor ...

  7. LeetCode-049-字母异位词分组

    字母异位词分组 题目描述:给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https: ...

  8. linux文件目录权限操作

    设置修改文件的属主或修改文件属组 [root@localhost ~]# ll test.txt -rw-r--r--. 1 root root 0 Oct 21 12:01 test.txt [ro ...

  9. java实现上传图片并压缩图片大小功能

    缩略图压缩文件jar包 <!-- 图片缩略图 --> <dependency> <groupId>net.coobird</groupId> <a ...

  10. tp6微信公众号开发者模式基础消息

    官方文档 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages ...