经过千辛万苦小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 希望找出总的切割点上的不和谐值最小的那个,即v(x, y, z)之和最小。

【输入格式】(input.txt)

从文件input.txt中读入数据,输入文件第一行是三个正整数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。

【输出格式】(output.txt)

输出文件output.txt 仅包含一个整数,表示在合法基础上最小的总不和谐值。

【输入输出样例】

input.txt                   output.txt

2 2 2                         6

1

6 1

6 1

2 6

2 6

input.txt                    output.txt

2 2 2                            12

0

5 1

5 1

2 5

2 5

【样例解释】

第一组样例中最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1。

第二组样例中最佳切面的f为f(1,1)=f(2,1)=f(1,2)=f(2,2)=1。

【时空限制】

 5s,512MB

【题解】

        看起来好像是个几何问题,其实可以用网络流最小割的思路来解决。贴lyc学长ppt:

将点权转化为边权。由S向(x,y,1)连边,边权为v(x,y,1)。由(x,y,z)向(x,y,z+1)连边,边权为v(x,y,z+1)。最后由(x,y,R)向T连边,边权为INF。此题关键在选择的距离限制,解决方法是由每个点向它相邻的点的下方的第d个点连边,也就是(x,y,z)向(x,y,z-d)连边,边权为INF。

学长的证明:

首先假设每条纵轴只割一条边。若两边距离大于d,一定会有图中所示路径,此时需再割一条边。

假设再割一条右侧的边,此边与左边割掉的那条边距离要<=d,否则还会出现这样的路径。

只有距离<=d,才能截断。但此时,右边第一次截断的边已经没有必要了。因为只要上面两条边就可以截断了。因此,每个纵轴只截断一条边,且相邻截断的边距离一定<=d。

除此之外只要注意一下四个方向都要连边,连边时注意边界就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int sj=;
int e,s,t,p,q,r,d,cnt,jg;
int h[sj],vl[][][],bm[][][],dep[sj];
struct B
{
int ne,v,w;
}b[sj*];
queue<int> qi;
void add(int x,int y,int z)
{
b[e].v=y;
b[e].w=z;
b[e].ne=h[x];
h[x]=e++;
}
void init()
{
scanf("%d%d%d%d",&p,&q,&r,&d);
s=;
t=r*p*q+;
memset(h,-,sizeof(h));
for(int i=;i<=r;i++)
for(int j=;j<=p;j++)
for(int k=;k<=q;k++)
{
scanf("%d",&vl[j][k][i]);
bm[j][k][i]=++cnt;
}
for(int i=;i<=p;i++)
for(int j=;j<=q;j++)
{
add(s,bm[i][j][],vl[i][j][]);
add(bm[i][j][],s,);
add(bm[i][j][r],t,0x3fff);
add(t,bm[i][j][r],);
for(int k=;k<=r;k++)
{
if(k!=r)
{
add(bm[i][j][k],bm[i][j][k+],vl[i][j][k+]);
add(bm[i][j][k+],bm[i][j][k],);
}
if(k>d)
{
if(i->)
{
add(bm[i][j][k],bm[i-][j][k-d],0x3fff);
add(bm[i-][j][k-d],bm[i][j][k],);
}
if(j->)
{
add(bm[i][j][k],bm[i][j-][k-d],0x3fff);
add(bm[i][j-][k-d],bm[i][j][k],);
}
if(i+<=p)
{
add(bm[i][j][k],bm[i+][j][k-d],0x3fff);
add(bm[i+][j][k-d],bm[i][j][k],);
}
if(j+<=q)
{
add(bm[i][j][k],bm[i][j+][k-d],0x3fff);
add(bm[i][j+][k-d],bm[i][j][k],);
}
}
}
}
}
bool bfs(int x)
{
while(!qi.empty()) qi.pop();
memset(dep,,sizeof(dep));
dep[x]=;
qi.push(x);
while(!qi.empty())
{
x=qi.front();
qi.pop();
for(int i=h[x];i!=-;i=b[i].ne)
if(b[i].w&&!dep[b[i].v])
{
dep[b[i].v]=dep[x]+;
if(b[i].v==t) return ;
qi.push(b[i].v);
}
}
return ;
}
int bj(int x,int y)
{
return x<y?x:y;
}
int dfs(int x,int f)
{
if(x==t) return f;
int ans=,d;
for(int i=h[x];i!=-;i=b[i].ne)
if(b[i].w&&dep[b[i].v]>dep[x])
{
d=dfs(b[i].v,bj(b[i].w,f));
f-=d;
ans+=d;
b[i].w-=d;
b[i^].w+=d;
if(!f) break;
}
if(!ans) dep[x]=-;
return ans;
}
int main()
{
init();
while(bfs(s)) jg+=dfs(s,0x7fffffff);
printf("%d",jg);
return ;
}

nutcake

我想吃切糕->食堂不卖->粽子都没有->我不开心

切糕[HNOI2013]的更多相关文章

  1. BZOJ 3144: [Hnoi2013]切糕

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

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

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

  3. BZOJ_3144_[Hnoi2013]切糕_最小割

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

  4. 【HNOI2013】切糕

    [HNOI2013]切糕 Sample Input 2 2 2 1 6 1 6 1 2 6 2 6 Sample Output 6 \(P,Q,R≤40,0≤D≤R\) 参考:https://blog ...

  5. bzoj千题计划142:bzoj3144: [Hnoi2013]切糕

    http://www.lydsy.com/JudgeOnline/problem.php?id=3144 如果D=2 ,两个点,高度为4,建图如下 #include<queue> #inc ...

  6. 【BZOJ3144】[HNOI2013]切糕

    [BZOJ3144][HNOI2013]切糕 题面 题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑 ...

  7. 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 Description Inp ...

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

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

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

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

随机推荐

  1. 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本

    前言 承接前文<短信发送接口被恶意访问的网络攻击事件(二)肉搏战-阻止恶意请求>,文中有讲到一个定位非法IP的shell脚本,现在就来公布一下吧,并没有什么技术难度,只是当时花了些时间去写 ...

  2. vue中使用stompjs实现mqtt消息推送通知

    最近在研究vue+webAPI进行前后端分离,在一些如前端定时循环请求后台接口判断状态等应用场景用使用mqtt进行主动的消息推送能够很大程度的减小服务端接口的压力,提高系统的效率,而且可以利用mqtt ...

  3. Mac, Linux中配置Latex中文字体

    对于中文的latex文档,在Linux下一般可以使用系统自带的开源字体:文泉驿(WenQuanYi)来实现,即如下的最小例子,通过xelatex命令来编译即可生成中文文档. \documentclas ...

  4. jQuery 评分插件(转)

    评分效果的小插件jQuery Raty.它提供的API相当丰富真的是让人爱不释手.详细文档及下载插件请移步这里. 基本使用 下面我们来实际操作,运用一下这个有爱的小插件. 需要做的事情非常简单,在页面 ...

  5. 【Android Developers Training】 16. 暂停和恢复一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 22. 与其他fragment通信

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  8. bootstrap table 插件多语言切换

    在bootstrap中的bootstrap table 插件在多语言切换的审核,只需要如下操作 引入bootstrap-table-locale-all.js文件 $('#Grid').bootstr ...

  9. Struts2之初识篇(一)——与struts的区别和基本配置

    Struts2资源下载地址: Struts官方地址:http://struts.apache.org/ 我这里下载了struts2的最新版本struts2-2.5.10.1-all.所有内容如下图: ...

  10. python中的可变与不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...