【BZOJ3144】[HNOI2013]切糕

题面

题目描述

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

出于简便考虑,我们将切糕视作一个长 P、宽 Q、高 R 的长方体点阵。我们将位于第 z层中第 x 行、第 y 列上(1≤x≤P, 1≤y≤Q, 1≤z≤R)的点称为(x,y,z),它有一个非负的不和谐值 v(x,y,z)。一个合法的切面满足以

下两个条件:

1.与每个纵轴(一共有 P*Q 个纵轴)有且仅有一个交点。即切面是一个函数 f(x,y),对于所有 1≤x≤P, 1≤y≤Q,我们需指定一个切割点 f(x,y),且 1≤f(x,y)≤R。

2.切面需要满足一定的光滑性要求,即相邻纵轴上的切割点不能相距太远。对于所有的 1≤x,x’≤P 和 1≤y,y’≤Q,若|x-x’|+|y-y’|=1,则|f(x,y)-f(x’,y’)| ≤D,其中 D 是给定的一个非负整数。 可能有许多切面f 满足上面

的条件,小A 希望找出总的切割点上的不和谐值最小的那个。

输入格式

第一行是三个正整数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。

输出格式

仅包含一个整数,表示在合法基础上最小的总不和谐值。

样例

输入样例

  1. 2 2 2
  2. 1
  3. 6 1
  4. 6 1
  5. 2 6
  6. 2 6

输出样例

  1. 6

说明

最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1

题解

注意题目第一句话:

经过千辛万苦小 A 得到了一块切糕

说到千辛万苦,我就想起了师徒四人去取经,今年下半年

中美,合拍,文体,开花 谢谢!!!

23333333


Q:当我们没有那个光滑度限制时怎么做呢?

A:每一个纵轴取max

A:往上新建一层\(R+1\),\(S\)连向第一层每个点的容量为\(\infty\)的边,第\(R+1\)层每个点向\(T\)连容量为\(\infty\)的边,对于\(\forall 1\leq k\leq R\),每个\((i,j,k)\)向\((i,j,k+1)\)连容量为\(v_{i,j,k}\)的边,再求最小割即可。

接下来考虑有光滑度限制的情况:

我们的限制条件是:

对\(|x-i|+|y-j|=1\)有\(f(x,y)-f(i,j)\leq D\)。

实际上就是要求\(f(x,y)-f(i,j)>D\)时,\(S\)可以到达\(T\)

那么直接由距离为\(1\)的两个点\((x,y),(i,j)\)

对于\(\forall D+1\leq k\leq R+1\),连\((i,j,k-D)\rightarrow(x,y,k)(cap=\infty)\)

最后跑最小割即可

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <queue>
  8. using namespace std;
  9. const int MAX_N = 50;
  10. const int MAX_V = MAX_N * MAX_N * MAX_N;
  11. const int INF = 1e9;
  12. struct Graph { int to, cap, next; } e[MAX_V << 2]; int fir[MAX_V], e_cnt, V;
  13. void clearGraph() { memset(fir, -1, sizeof(fir)); e_cnt = 0; }
  14. void Add_Edge(int u, int v, int c) {
  15. e[e_cnt] = (Graph){v, c, fir[u]}, fir[u] = e_cnt++;
  16. e[e_cnt] = (Graph){u, 0, fir[v]}, fir[v] = e_cnt++;
  17. }
  18. int level[MAX_V], iter[MAX_V];
  19. void bfs(int s) {
  20. static queue<int> que; fill(&level[0], &level[V + 1], -1);
  21. que.push(s), level[s] = 0;
  22. while (!que.empty()) {
  23. int x = que.front(); que.pop();
  24. for (int i = fir[x]; ~i; i = e[i].next) {
  25. int v = e[i].to;
  26. if (level[v] == -1 && e[i].cap > 0) level[v] = level[x] + 1, que.push(v);
  27. }
  28. }
  29. }
  30. int dfs(int x, int t, int f) {
  31. if (x == t || !f) return f;
  32. for (int &i = iter[x]; ~i; i = e[i].next) {
  33. int v = e[i].to;
  34. if (e[i].cap > 0 && level[v] > level[x]) {
  35. int d = dfs(v, t, min(f, e[i].cap));
  36. if (d != 0) {
  37. e[i].cap -= d;
  38. e[i ^ 1].cap += d;
  39. return d;
  40. } else level[v] = -1;
  41. }
  42. }
  43. return 0;
  44. }
  45. int max_flow(int s, int t) {
  46. int flow = 0;
  47. for (;;) {
  48. bfs(s);
  49. if (level[t] == -1) return flow;
  50. int f;
  51. for (int i = 0; i <= V; i++) iter[i] = fir[i];
  52. while ((f = dfs(s, t, INF))) flow += f;
  53. }
  54. }
  55. int P, Q, R, D, a[MAX_N][MAX_N][MAX_N];
  56. const int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
  57. int main () {
  58. clearGraph();
  59. scanf("%d%d%d%d", &P, &Q, &R, &D);
  60. for (int k = 1; k <= R; k++)
  61. for (int i = 1; i <= P; i++)
  62. for (int j = 1; j <= Q; j++)
  63. scanf("%d", &a[i][j][k]);
  64. int s = 0, t = P * Q * (R + 1) + 1; V = t;
  65. for (int i = 1; i <= P; i++)
  66. for (int j = 1; j <= Q; j++) {
  67. int x = (i - 1) * Q + j + 1;
  68. Add_Edge(s, x, INF);
  69. for (int k = 1; k <= R; k++) Add_Edge(P * Q * (k - 1) + x, P * Q * k + x, a[i][j][k]);
  70. Add_Edge(P * Q * R + x, t, INF);
  71. }
  72. for (int i = 1; i <= P; i++)
  73. for (int j = 1; j <= Q; j++)
  74. for (int h = 0; h < 4; h++) {
  75. int x = i + dx[h], y = j + dy[h];
  76. if (x < 1 || x > P || y < 1 || y > Q) continue;
  77. for (int k = D + 1; k <= R + 1; k++)
  78. Add_Edge(P * Q * (k - 1) + (i - 1) * Q + j + 1, P * Q * (k - D - 1) + (x - 1) * Q + y + 1, INF);
  79. }
  80. printf("%d\n", max_flow(s, t));
  81. return 0;
  82. }

【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]切糕

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1494  Solved: 818 Description Input 第一行是三个正整数P,Q,R,表 ...

  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]切糕 【最小割】

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

  7. [BZOJ3144][HNOI2013]切糕(最小割)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3144 分析:神题不解释 http://www.cnblogs.com/zig-zag/ ...

  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. angularJs的工具方法3

    一.angular.version          判断angular的版本 console.log(angular.version); 二.angular.equals           判断两 ...

  2. 30、springboot与检索(2)

    项目中进行整合: 1.整合 新建项目加入依赖(NoSql) springboot默认使用SpringDate ElasticSearch模块进行操作   查看自动配置类: SpringBoot默认支持 ...

  3. SpringMVC DELETE,PUT请求报错 添加支持Http的DELETE、PUT请求

    SpringMVC删除与修改操作需要用DELETE,PUT请求方式提交. 但要知道浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持. spring3.0添加了 ...

  4. Eclipse查看.properties文件中文乱码

    在中文操作系统中,Eclipse中的Java类型文件的编码的默认设置是GBK,但是对Properties资源文件的编码的默认设置是ISO-8859-1.所以编辑Java文件中的中文不会出现问题,但编辑 ...

  5. PAT——1074. 宇宙无敌加法器(20)

    地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在PAT星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个PAT星人都必须熟记各位数字的进制表,例如 ...

  6. ovs加dpdk出现EAL No free hugepages reported in hugepages-1048576kB

    问题 打开ovs的日志: cat /etc/local/var/log/openvswitch/ovs-vswichd.log 其中一条显示: 2018-07-30T02:12:05.443Z|000 ...

  7. Linux 防止rm -rf 误删Shell脚本

    #!/bin/bash #:set ff=unix #:set nobomb #-*- coding:utf-8 -*- ####################################### ...

  8. VMware虚拟机安装Centos7图文教程

    CentOS 是一个工业标准的 Linux 发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  9. iOS原生分享功能

    iOS_系统原生分享 - CSDN博客 通过UIActivityViewController实现更多分享服务 - 简书 UIActivity - UIKit _ Apple Developer Doc ...

  10. 偏前端-vue.js学习之路初级(一)概念

    首先--不推荐新手直接使用 vue-cli,尤其是在你还不熟悉基于 Node.js 的构建工具时.    新建一个html,引入一下js: <!-- 开发环境版本,包含了有帮助的命令行警告 -- ...