【BZOJ 3144】 [Hnoi2013]切糕 真·最小割
一开始一脸懵逼后来发现,他不就是割吗,我们只要满足条件就割就行了,于是我们把他连了P*Q*R条边,然而我们要怎样限制D呢?我们只要满足对于任意相邻的两条路,只要其有个口大于D就不行就好了因此我们只要把每个点向离他D距离的下面的店连一条Inf连线就可以啦,因此我们就满足了一定是所有相邻的路径上存在不超过距离D的缺口,由于满足这条性质因此至少存在一层两两之间距离不超过D的膜因此最终答案一定是每条路上割一个,因此就让他跑去把!
#include <cstdio>
#include <cstring>
#define N 50
#define LL 8000000
#define r register
#define Inf 0x7f7f7f7f
using namespace std;
inline int read()
{
r int sum=;
r char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct VIA
{
int to,next,f;
}c[LL];
int head[N*N*N],t=;
int q[N*N*N],top,tail,deep[N*N*N],Hash[N][N][N];
int a[N][N][N],S,T;
inline void add(int x,int y,int z)
{
c[++t].to=y;
c[t].next=head[x];
head[x]=t;
c[t].f=z;
}
inline bool bfs()
{
memset(deep,,sizeof(deep));
deep[S]=;
q[]=S;
top=tail=;
while(top<=tail)
{
r int x=q[top++];
if(x==T)return ;
for(int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==)
{
deep[c[i].to]=deep[x]+;
q[++tail]=c[i].to;
}
}
return ;
}
int dfs(int x,int v)
{
if(x==T||!v)return v;
r int ret=;
for(r int i=head[x];i;i=c[i].next)
if(c[i].f&&deep[c[i].to]==deep[x]+)
{
r int f=dfs(c[i].to,c[i].f<v?c[i].f:v);
v-=f,ret+=f,c[i].f-=f,c[i^].f+=f;
if(!v)break;
}
if(!ret)deep[x]=-;
return ret;
}
inline int dinic()
{
r int ans=;
while(bfs())ans+=dfs(S,Inf);
return ans;
}
int L,W,H,D;
int main()
{
L=read(),W=read(),H=read(),D=read();
S=L*W*H+,T=S+;
for(r int i=;i<=H;++i)
for(r int j=;j<=L;++j)
for(r int k=;k<=W;++k)
a[j][k][i]=read(),Hash[j][k][i]=(i-)*L*W+(j-)*W+k;
if(H!=)
{
for(r int i=;i<=L;++i)
for(r int j=;j<=W;++j)
{
add(S,Hash[i][j][],a[i][j][]),add(Hash[i][j][],S,);
for(r int k=;k<H;++k)
add(Hash[i][j][k-],Hash[i][j][k],a[i][j][k]),add(Hash[i][j][k],Hash[i][j][k-],);
add(Hash[i][j][H-],T,a[i][j][H]),add(T,Hash[i][j][H-],);
if(H<=+D)continue;
if(i!=)
{
add(Hash[i][j][D],S,Inf),add(S,Hash[i][j][D],);
for(r int k=D+;k<H;++k)
add(Hash[i][j][k],Hash[i-][j][k-D],Inf),add(Hash[i-][j][k-D],Hash[i][j][k],);
add(T,Hash[i-][j][H-D],Inf),add(Hash[i-][j][H-D],T,);
}
if(i!=L)
{
add(Hash[i][j][D],S,Inf),add(S,Hash[i][j][D],);
for(r int k=D+;k<H;++k)
add(Hash[i][j][k],Hash[i+][j][k-D],Inf),add(Hash[i+][j][k-D],Hash[i][j][k],);
add(T,Hash[i+][j][H-D],Inf),add(Hash[i+][j][H-D],T,);
}
if(j!=)
{
add(Hash[i][j][D],S,Inf),add(S,Hash[i][j][D],);
for(r int k=D+;k<H;++k)
add(Hash[i][j][k],Hash[i][j-][k-D],Inf),add(Hash[i][j-][k-D],Hash[i][j][k],);
add(T,Hash[i][j-][H-D],Inf),add(Hash[i][j-][H-D],T,);
}
if(j!=W)
{
add(Hash[i][j][D],S,Inf),add(S,Hash[i][j][D],);
for(r int k=D+;k<H;++k)
add(Hash[i][j][k],Hash[i][j+][k-D],Inf),add(Hash[i][j+][k-D],Hash[i][j][k],);
add(T,Hash[i][j+][H-D],Inf),add(Hash[i][j+][H-D],T,);
}
}
}
else
{
for(r int i=;i<=L;++i)
for(r int j=;j<=W;++j)
add(S,T,a[i][j][]),add(T,S,);
}
printf("%d",dinic());
return ;
}
【BZOJ 3144】 [Hnoi2013]切糕 真·最小割的更多相关文章
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- 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 ...
- BZOJ_3144_[Hnoi2013]切糕_最小割
BZOJ_3144_[Hnoi2013]切糕_最小割 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R ...
- bzoj 3144: [Hnoi2013]切糕 最小割
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 375[Submit][Status] ...
- BZOJ 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1495 Solved: 819[Submit][Status] ...
- 【刷题】BZOJ 3144 [Hnoi2013]切糕
Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...
- 【bzoj3144】[Hnoi2013]切糕 网络流最小割
题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
- BZOJ3144 [Hnoi2013]切糕 【最小割】
题目 输入格式 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
随机推荐
- php后端跨域Header头
header("Access-Control-Allow-Origin: http://a.com"); // 允许a.com发起的跨域请求 //如果需要设置允许所有域名发起的跨域 ...
- FireDAC内存表
procedure TForm1.FormCreate(Sender: TObject); Var i:integer; begin // i:=; self.FDMemTable1.FieldDef ...
- keil5 mdk调用外部编辑器notepad++、sublime3、VSCode总结
1.打开keil主界面,点击菜单栏Tools菜单,选择如下图所示的选项. 2.点击如下图所示的菜单上红笔标注的地方,给这个工具命名,如notepad++.sublime3.vscode等,如下图, 并 ...
- ruby Time类与Date类
Time类用于表示时间.时间除了表示年月日时分秒的信息外,还包含了表示地域时差的时区(time zone)信息.例如我们可以计算中国当前时间是国际协调时间的几点 Date类只用于表示年月日.因此,相对 ...
- 51定时器控制4各led,使用回调函数机制
程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件. 程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中 ...
- 多线程编程以及socket编程_Linux程序设计4chapter15
看了Linux程序设计4中文版,学习了多线程编程和socket编程.本文的程序参考自Linux程序设计4的第15章. 设计了一个客户端程序,一个服务端程序.使用TCP协议进行数据传输. 客户端进程创建 ...
- Go语言的标准net库使用
Go语言的标准net库使用 与大多数语言一样,Go的标准库是很全的,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得很简洁,也更加的易读.这里对使用到的api进行记录. net ...
- (长期更新)OI常用模板
代码很简单的模板就不收录了. DFT 离散傅立叶变换 void dft(pdd *a,int l,bool r){ int i,j=l/2,k; for(i=1;i<l;++i){ if(i&l ...
- MongoDB入门---简介
最近呢,刚好有一些时间,所以就学习了一下新的数据库类型MongoDB.要想了解这个MongoDB,我们首先需要了解一个概念,那就是nosql(not only sql).一下就是官方的概念: NoSQ ...
- SLAM中的常识与经验
双目矫正 双目通常事先是通过畸变矫正标定的,而RGB-D和单目则并不一定完成了矫正. 因此,对于RGB-D和单目获取的图像,在提取特征点之后,需要矫正,而双目则可以省略这一过程. 词袋模型反向索引 D ...