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 $ )的边就行

然后直接跑最小割。

#include<bits/stdc++.h>
using namespace std;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
tar=ret*f;
}
namespace LarjaIX
{
const int N=70011,M=1000011,inf=0x3f3f3f3f;
struct sumireko{int to,ne,w;}e[M<<1];int he[N],ecnt=1;
void addline(int f,int t,int w)
{
e[++ecnt].to=t,e[ecnt].w=w;
e[ecnt].ne=he[f],he[f]=ecnt;
e[++ecnt].to=f,e[ecnt].w=0;
e[ecnt].ne=he[t],he[t]=ecnt;
}
int head[N],dep[N];bool ins[N];
queue<int> qu;
bool bfs(int sp,int ep)
{
memcpy(head,he,sizeof(head));
memset(dep,0x3f,sizeof(dep));
dep[sp]=1,ins[sp]=1,qu.push(sp);
while(!qu.empty())
{
int x=qu.front();qu.pop();ins[x]=0;
for(int ei=he[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
if(e[ei].w&&dep[t]>dep[x]+1)
{
dep[t]=dep[x]+1;
if(!ins[t]) qu.push(t),ins[t]=1;
}
}
return dep[ep]!=inf;
}
int dfs(int x,int lim,int ep)
{
if(x==ep||!lim) return lim;
int ret=0,tmp=0;
for(int ei=head[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
{
head[x]=ei;
if(dep[t]==dep[x]+1) if(tmp=dfs(t,min(lim,e[ei].w),ep))
{
lim-=tmp,ret+=tmp;
e[ei].w-=tmp,e[ei^1].w+=tmp;
}
}
return ret;
}
int dinic(int sp,int ep)
{
int ret=0;
while(bfs(sp,ep))
ret+=dfs(sp,inf,ep);
return ret;
}
int p,q,r,d,a[44][44][44],id[44][44][44],ic,S,E;
int maid()
{
read(p),read(q),read(r),read(d);
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]);
r++;
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;
for(int x=1;x<=p;x++)for(int y=1;y<=q;y++)
{
addline(S,id[x][y][1],inf),addline(id[x][y][r],E,inf);
for(int z=1;z<r;z++)
{
addline(id[x][y][z],id[x][y][z+1],a[x][y][z]);
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);
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);
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);
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);
}
}
printf("%d\n",dinic(S,E));
return 0;
}
}
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. 组合&反射&面向对象内置函数

    内容概要 组合 反射 面向对象的内置函数 异常 内容详细 一.组合 组合:在对象中定义一个属性,属性的值是另一个对象 除了继承父类的方法,这是获取另一个类中属性的另一种方式 如果想给学生对象添加课程属 ...

  2. [LeetCode]9.回文数(Java)

    原题地址: palindrome-number 题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都 ...

  3. 使用Sinopia部署私有npm仓库

    使用Sinopia部署私有npm仓库 [root@localhost ~]# hostnamectl set-hostname --static npm-server [root@npm-server ...

  4. 一位资深IT技术员的心声

    引言 我对于本科时光的印象,还停留在那所普通 211 大学的建筑物之间,我坐在大学的时光长廊里,满眼望去,都是经历的过的故事.可毕业后回首,却很少有人能说,自己从来没有迷茫过.迷茫,仿佛就是一团乌云, ...

  5. 创建jsp页面出现The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误

    原因未添加tomcat服务器 第一步: 第二步:

  6. demo_2_27

    #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h> int count_bit_one ...

  7. k8s中prometheus监控k8s外mysql

    k8s外安装mysql https://www.cnblogs.com/uncleyong/p/10739530.html 配置MySQL Exporter采集MySQL监控数据 创建yaml文件:v ...

  8. 一文带你秒懂商业智能BI的价值所在!

    首先,先来跟大家解释说明一下什么是商业智能?这应该也是刚刚接触商业智能的小伙伴最想要了解的问题,平时刷微博.看头条时都会看到数据可视化.数据分析和大数据等词汇时,但是对它们如同熟悉的陌生人一般,那么这 ...

  9. 这款智能又高效的自助式BI工具,你应该了解一下

    如今,企业的经营面临越来越激烈的竞争,如何将数据的价值发挥到最大化,成为众多企业急需解决的问题.如果部署数据分析平台还像以前那样要经历漫长实施过程的话,那么数据化运营将成为空谈.在市场需求的催化下,& ...

  10. PPT绝对不能没有它!精美酷炫的可视化图表来啦!

    从我们上学到工作,PPT我们见得多了,也做得多了.上学的时候最怕老师布置的作业是以PPT形式上交,工作中项目汇报.工作总结.年终汇报等,哪哪都需要用到PPT.PPT中文字太多,被批判不够简炼:图片太多 ...