洛谷 P3227 BZOJ 3144 [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)。一个合法的切面满足以下两个条件:
与每个纵轴(一共有 P*Q 个纵轴)有且仅有一个交点。即切面是一个函数 f(x,y),对于所有 1≤x≤P, 1≤y≤Q,我们需指定一个切割点 f(x,y),且 1≤f(x,y)≤R。
- 切面需要满足一定的光滑性要求,即相邻纵轴上的切割点不能相距太远。对于所有的 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。
输出格式:
仅包含一个整数,表示在合法基础上最小的总不和谐值。
输入输出样例
2 2 2
1
6 1
6 1
2 6
2 6
6
说明
最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1
吐槽
我为什么最近会突然开始刷网络流呢?因为最近在长乐一中集训,难得美国队长妹滋滋大佬来讲课,讲了一整天的网络流,我记了差不多20页信笺纸的笔记……(听课时开着电脑会损失很大的,不骗你,记笔记是个很好的学习习惯啊) 那天听得我脑力耗尽,去吃中午饭时让同行的Neil描述成——让他想到了一个游戏“饥荒”。详见……
最近请教某些大佬时遭到了BS,RP暴涨啊,常数巨小,下面的代码占领了洛谷的rank1~3(我交了三次嘻嘻),不开O2时正好rank20(交那三次之前)。
真记不得这个题面玩的梗是咋回事了……好像那是我初二上学期的时候,那段时间嫦娥几号来着还着陆在月球来着,我那晚看了CCTV三个小时的直播。记得那时日子多么美好…………
好了,暂停回忆吧,咳咳!开始讲题——
解题思路
一道离散变量模型裸题。妹滋滋的幻灯片上这么说的——//不知道这样是否违反了某些基本法,如果有请告知,我删除

对于切糕这题——

源代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm> int p,q,r,D;
int cake[][][]={}; int s,t;
struct Edge{
int next,to,c;
}e[];
int head[],cnt=;
void add(int u,int v,int c)
{
e[cnt]={head[u],v,c};
head[u]=cnt++;
e[cnt]={head[v],u,};
head[v]=cnt++;
} int dis[]={};
bool bfs()
{
memset(dis,,sizeof(dis));
dis[s]=;
std::queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(e[i].c==||dis[v]) continue;
dis[v]=dis[u]+;
q.push(v);
}
}
return dis[t]!=;
} int dfs(int u,int flow)
{
if(flow==||u==t) return flow;
int flow_sum=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to,f=std::min(e[i].c,flow-flow_sum);
if(dis[v]!=dis[u]+||!e[i].c) continue;
int temp=dfs(v,f);
e[i].c-=temp;
e[i^].c+=temp;
flow_sum+=temp;
if(flow<=flow_sum) break;
}
if(flow_sum==) dis[u]=-;
return flow_sum;
} int dinic()
{
int ans=;
while(bfs())
while(int temp=dfs(s,0x7f7f7f7f))
ans+=temp;
return ans;
} inline int id(int x,int y,int z)
{
if(z==) return s;
if(z==r+) return t;
return (z-)*p*q+(x-)*q+y;
} int main()
{
//freopen("test.in","r",stdin);
scanf("%d%d%d%d",&p,&q,&r,&D);
s=p*q*r+,t=s+;
for(int i=;i<=r;i++)
for(int j=;j<=p;j++)
for(int k=;k<=q;k++)
scanf("%d",&cake[j][k][i]);//网络流的题输入都很恶心,优化高维数组取值太饶了,索性不搞
;
/***建图***/
int bh[][]={{,},{,-},{-,},{,}};
for(int i=;i<=p;i++)
{
for(int j=;j<=q;j++)
{
for(int k=;k<=r;k++)
{
add(id(i,j,k-),id(i,j,k),cake[i][j][k]);
if(k>D)//四周
{
int h=k-D;
for(int aa=;aa<;aa++)
{
int ii=i+bh[aa][],jj=j+bh[aa][];
if(ii>&&ii<=p&&jj>&&jj<=q)
add(id(i,j,k),id(ii,jj,h),0x7f7f7f7f);
}
}
}
add(id(i,j,r),t,0x7f7f7f7f);
}
}
printf("%d",dinic());
return ;
}
洛谷 P3227 BZOJ 3144 [HNOI2013]切糕的更多相关文章
- BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...
- BZOJ 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1495 Solved: 819[Submit][Status] ...
- bzoj 3144: [Hnoi2013]切糕 最小割
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 375[Submit][Status] ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- 【刷题】BZOJ 3144 [Hnoi2013]切糕
Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...
- bzoj 3144 [Hnoi2013]切糕——最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 一根纵轴上切一个点,可以把一根纵轴上的点连成一串来体现.自己的写法是每个点连向前一个点 ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj 3144 [Hnoi2013]切糕【最小割+dinic】
都说了是'切'糕所以是最小割咯 建图: 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前 ...
- 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1764 Solved: 965 Description Inp ...
随机推荐
- QMessageBox 的四种用法
void MainWindow::on_info_clicked() { //info QMessageBox::information(this, "Title", " ...
- Struts2标签库常用标签
转自:https://blog.csdn.net/q547550831/article/details/53326042
- etcd数据备份与恢复验证
一.单机 说明:执行etcd备份数据的恢复的机器必须和原先etcd所在机器一致 1.单机备份 etcdctl --endpoints="https://10.25.72.62:2379&qu ...
- [Apple开发者帐户帮助]五、管理标识符(3)删除应用程序ID
您可以在不再需要时删除App ID.但是,您无法删除上载到App Store Connect的应用程序的显式应用程序ID . 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左 ...
- JNI学习积累之一 ---- 常用函数大全
主要资料来源: 百度文库的<JNI常用函数> . 同时对其加以了补充 . 要素 :1. 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的 ...
- CALayer帧动画
CALayer帧动画 _sunLayer = [[CALayer alloc]init]; _sunLayer.contents = (id)[UIImage imageNamed:@"su ...
- Laravel5.1 学习笔记1, 目录结构和命名空间(待修)
自从用 Laravel4做了个小网站,使用了数据库ORM Eloquent, 就放下了一段时间,想不到这个与Asp.net MVC 有着异曲同工之妙的框架已经出了下个版本,而且还有不小的改动,因此不得 ...
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- js基础标签用法
js是脚本语言,开始标签<script type="text/javascript">.......结束标签</script>.script通常放在< ...
- Scala——面向对象和函数式编程语言
Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...