https://www.lydsy.com/JudgeOnline/problem.php?id=3144

看着很像网络流,但是费用流貌似无法解决这个问题,其实甚至连忽略d的情况都做不到。

最小割?

将顶层和底层分成两个集合,切一次就相当于两个集合分开。

所以我们(i,j,k)->(i,j,k+1)边权为val(i,j,k)就可以做忽略d的情况了。

那么有d也很简单,只需要想你切完了一条边之后,不能让你身边的切哪些边即可。

画个图,我们就能发现(i,j,k)->(i,j,k-d)和(i,j,k+d+1)->(i,j,k+1)边权为INF就能保证如果切了非法的边仍然能保证连通。

(当然在遍历的时候后者的边也是前者的边,于是我们只需要加前者的边即可。)

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int B=;
const int N=B*B*B+B*B;
const int M=N*;
const int INF=1e9;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int to,nxt,w;
}e[M];
int P,Q,R,D,cnt,head[N],cur[N],lev[N];
int val[B][B][B],dui[N],r,S,T;
int dx[]={,,,-};
int dy[]={,,-,};
inline void add(int u,int v,int w){
e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
bool bfs(int m){
for(int i=;i<=m;i++){
cur[i]=head[i];lev[i]=-;
}
lev[S]=;dui[r=]=S;
for(int l=;l<=r;l++){
int u=dui[l];
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(e[i].w&&lev[v]==-){
dui[++r]=v;
lev[v]=lev[u]+;
if(v==T)return ;
}
}
}
return ;
}
int dinic(int u,int flow,int m){
if(u==m)return flow;
int res=,delta;
for(int &i=cur[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(lev[v]>lev[u]&&e[i].w){
delta=dinic(v,min(flow-res,e[i].w),m);
if(delta){
res+=delta;
e[i].w-=delta;
e[i^].w+=delta;
if(res==flow)break;
}
}
}
if(res!=flow)lev[u]=-;
return res;
}
inline int num(int i,int j,int k){
return (k-)*P*Q+(i-)*Q+j;
}
int main(){
cnt=-;memset(head,-,sizeof(head));
P=read(),Q=read(),R=read();
D=read();
S=(R+)*P*Q+,T=S+;
for(int k=;k<=R;k++)
for(int i=;i<=P;i++)
for(int j=;j<=Q;j++){
int u=num(i,j,k),v=num(i,j,k+);
add(u,v,read());add(v,u,);
if(k>D)
for(int l=;l<;l++){
int nx=i+dx[l],ny=j+dy[l];
if(nx<||nx>P||ny<||ny>Q)continue;
int nv=num(nx,ny,k-D);
add(u,nv,INF);add(nv,u,);
}
}
for(int i=;i<=P;i++)
for(int j=;j<=Q;j++){
int v=num(i,j,),u=num(i,j,R+);
add(S,v,INF);add(v,S,);
add(u,T,INF);add(T,u,);
}
int ans=;
while(bfs(T))ans+=dinic(S,INF,T);
printf("%d\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ3144:[HNOI2013]切糕——题解的更多相关文章

  1. bzoj3144 [HNOI2013]切糕(最小割)

    bzoj3144 [HNOI2013]切糕(最小割) bzoj Luogu 题面描述见上 题解时间 一开始我真就把这玩意所说的切面当成了平面来做的 事实上只是说相邻的切点高度差都不超过 $ d $ 对 ...

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

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

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

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

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

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

  5. Bzoj3144 [Hnoi2013]切糕

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

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

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

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

随机推荐

  1. NB-IOT修改KV值的方法

    1. 安装UEConfigurationEditor-3.22.0.14.msi,之后打开一个fwpkg文件,如下图 2. 找到需要修改的KV值,修改之后,点击Apply changes,应用修改,然 ...

  2. 《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法

    <绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来“爆锤吧务”分享的<绝地求生大逃杀>BE服务未正常运行及安装 ...

  3. jsp传递参数的四种方法

    1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a= ...

  4. 浅谈如何提高自动化测试的稳定性和可维护性 (pytest&allure)

    装饰器与出错重试机制 谈到稳定性,不得不说的就是“出错重试”机制了,在自动化测试中,由于环境一般都是测试环境,经常会有各种各种的抽风情况影响测试结果,这样就为测试的稳定性带来了挑战,毕竟谁也不想自己的 ...

  5. CentOS安装nmon

    nmon官网: http://nmon.sourceforge.net/pmwiki.php?n=Main.HomePage 下载nmon16e_mpginc.tar.gz到本地并上传到服务器 tar ...

  6. php redis和java混用问题

    目前项目是 一个php 一个java  共用一套 redis  key  value 也都一样,  java 使用 gson 解析json   会将php 设置的json里面看  {"a&q ...

  7. Ubuntu 16.04 安装显卡驱动后循环登录和无法设置分辨率的一种解决方案

    1. 安装环境 电脑:MSI GP63 显卡:GeForce GTX 1070 系统:Ubuntu 16.04 驱动版本:NVIDIA 384.130 2. 循环登录 如果按照这篇文章 Ubuntu ...

  8. Netcore logging config

  9. URAL 1519 Formula 1(插头DP,入门题)

    Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...

  10. 默认初始化&拷贝初始化&直接初始化&值初始化&列表初始化

    一.各种初始化的形式 /* 定义变量形式一:不指定初始值 */ int a; // 默认初始化 /* 定义变量形式二:指定初始值 */ int b = 1; // 拷贝初始化 int b(1); // ...