最小割模板。

题意:你要在一个三维点阵的每个竖条中删去一个点,使得删去的点权和最小。

且相邻(四联通)的两竖条之间删的点的z坐标之差的绝对值不超过D。

解:

首先把这些都串起来,点边转化,就变成最小割了对吧。

那么限制条件怎么处理呢?

我们知道在最小割中流量为INF的边是割不断的,以此来连边,使得相邻的割点超过D不合法。

具体来说:把相邻的两条链中,差距刚好为D的点连起来。从上往下连INF。

这是D = 1的一个连边实例。

可以发现,我们割两个在同一高度的边是没问题的。

如果高度相差1也没问题。

如果左边的高2格,那么会被红色的边限制;如果右边的高2格又会被蓝色的边限制。

所以这样连边就能够满足限制条件了。

然后跑最小割即可。

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. #include <cstring>
  5.  
  6. const int N = , M = , INF = 0x3f3f3f3f;
  7. const int dx[] = {, , -, };
  8. const int dy[] = {, , , -};
  9.  
  10. struct Edge {
  11. int nex, v, c;
  12. }edge[M << ]; int top = ;
  13.  
  14. int e[N], d[N], m, n;
  15. std::queue<int> Q;
  16.  
  17. inline void add(int x, int y, int z) {
  18. top++;
  19. edge[top].v = y;
  20. edge[top].c = z;
  21. edge[top].nex = e[x];
  22. e[x] = top;
  23.  
  24. top++;
  25. edge[top].v = x;
  26. edge[top].c = ;
  27. edge[top].nex = e[y];
  28. e[y] = top;
  29. return;
  30. }
  31.  
  32. inline bool BFS(int s, int t) {
  33. memset(d, , sizeof(d));
  34. d[s] = ;
  35. Q.push(s);
  36. while(!Q.empty()) {
  37. int x = Q.front();
  38. Q.pop();
  39. for(int i = e[x]; i; i = edge[i].nex) {
  40. int y = edge[i].v;
  41. if(!edge[i].c || d[y]) {
  42. continue;
  43. }
  44. d[y] = d[x] + ;
  45. Q.push(y);
  46. }
  47. }
  48. return d[t];
  49. }
  50.  
  51. int DFS(int x, int t, int maxF) {
  52. if(x == t) {
  53. return maxF;
  54. }
  55. int ans = ;
  56. for(int i = e[x]; i; i = edge[i].nex) {
  57. int y = edge[i].v;
  58. if(!edge[i].c || d[x] + != d[y]) {
  59. continue;
  60. }
  61. int temp = DFS(y, t, std::min(edge[i].c, maxF - ans));
  62. if(!temp) {
  63. d[y] = INF;
  64. }
  65. ans += temp;
  66. edge[i].c -= temp;
  67. edge[i ^ ].c += temp;
  68. if(ans == maxF) {
  69. break;
  70. }
  71. }
  72. return ans;
  73. }
  74.  
  75. inline int solve(int s, int t) {
  76. int ans = ;
  77. while(BFS(s, t)) {
  78. ans += DFS(s, t, INF);
  79. }
  80. return ans;
  81. }
  82.  
  83. inline int id(int x, int y, int z) {
  84. return z * n * m + (x - ) * m + y;
  85. }
  86.  
  87. int main() {
  88. int r, D, x;
  89. scanf("%d%d%d%d", &n, &m, &r, &D);
  90. for(int k = ; k <= r; k++) {
  91. for(int i = ; i <= n; i++) {
  92. for(int j = ; j <= m; j++) {
  93. scanf("%d", &x);
  94. add(id(i, j, k - ), id(i, j, k), x);
  95. }
  96. }
  97. }
  98. int s = n * m * (r + ) + ;
  99. int t = s + ;
  100. for(int i = ; i <= n; i++) {
  101. for(int j = ; j <= m; j++) {
  102. for(int k = D; k <= r; k++) {
  103. for(int dir = ; dir < ; dir++) {
  104. x = i + dx[dir];
  105. int y = j + dy[dir];
  106. if(x && y && x <= n && y <= m) {
  107. add(id(i, j, k), id(x, y, k - D), INF);
  108. }
  109. }
  110. }
  111. add(s, id(i, j, ), INF);
  112. add(id(i, j, r), t, INF);
  113. }
  114. }
  115.  
  116. int ans = solve(s, t);
  117. printf("%d", ans);
  118. return ;
  119. }

AC代码

洛谷P3227 切糕的更多相关文章

  1. 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

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

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

  3. 【洛谷 P3227】 [HNOI2013]切糕(最小割)

    题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...

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

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

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

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

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. ORM框架-SQLAchemy使用

    一.ORM简介 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的 ...

  2. 20155307《网络对抗》Web安全基础实践

    20155307<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  3. Centos7下vim的table键修改为4个空格

    1.要有root用户权限 2.已经安装vim 3.编辑/etc/vim/vimrc 文件,添加set ts=4 vim /etc/vimrc #按大写G到最后一行,添加set ts= set ts = ...

  4. [CF1039E]Summer Oenothera Exhibition[根号分治+lct]

    题意 给一个长度为 \(n\) 的序列, \(q\) 次询问,次给一个 \(k_i\) ,问最少将序列划分成多少次,满足每一段的极差不超过\(w−k_i\). \(1 \leq n, q \leq 1 ...

  5. 没有任何秘密的 API:Vulkan* 简介

    Vulkan 被视作是 OpenGL 的后续产品. 它是一种多平台 API,可支持开发人员准备游戏.CAD 工具.性能基准测试等高性能图形应用. 它可在不同的操作系统(比如 Windows*.Linu ...

  6. Unity 图文重现官方教程视频 2droguelike 第一集

    初衷: 本人初学Unity,四处收集了一些视频和教材,学习和摸索了一段时间, 我发现官网教程简单易上手,只不过他是英文讲解不方便,我就想把他翻译翻译吧, 然后我又发现看视频学习要暂停回放好多遍,麻烦, ...

  7. 机器学习初入门04 – Seaborn(持续更新)

    Seaborn库可以说是在matplotlib库上的一个封装,它给我们提供了非常丰富的模板 一.整体布局风格设置 import seaborn as sns import numpy as np im ...

  8. 机器学习1—简介及Python机器学习环境搭建

    简介 前置声明:本专栏的所有文章皆为本人学习时所做笔记而整理成篇,转载需授权且需注明文章来源,禁止商业用途,仅供学习交流.(欢迎大家提供宝贵的意见,共同进步) 正文: 机器学习,顾名思义,就是研究计算 ...

  9. 【Beta阶段】第三次Scrum Meeting!

    每日任务内容: 本次会议为第三次Scrum Meeting会议~ 由于本次会议项目经理召开时间依旧较晚(晚上12点半),所以在公寓7层召开,女生参与了线上会议,召开时间大家集会10分钟. 队员 昨日完 ...

  10. Leetcode题库——47.全排列II

    @author: ZZQ @software: PyCharm @file: permuteUnique.py @time: 2018/11/16 13:34 要求:给定一个可包含重复数字的序列,返回 ...