正解:网络流

解题报告:

传送门!

日常看不懂题系列,,,$QAQ$

所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$,要求相邻格子之间差不超过$D$.求$\sum v_{i,j,a_{i,j}}$的$min$

昂,先考虑如果没有$D$这个限制网络流怎么做鸭$QwQ$.就一个,比较显然的最小割,对每个位置$(i,j)$开一行点连起来,第$k$个点和第$k+1$个点之间的流量为$v_{i,j,k+1}$,切开就表示这个位置取值为$k+1$,跑个最小割就好$QwQ$

然后现在加上了一个,相差不能超过$D$的约束,考虑怎么加边保证相差不超过$D$?$QwQ$

昂懒得写过程了直接说结论趴,就连接每对$(i,j,k)$&$(i\pm 1,j\pm 1,k-D)$,就可以保证如果选的是两个差距大于$D$的数时不可能是满流$QwQ$

最后跑个最小割就成,$over$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define n(i) edge[i].nxt
#define w(i) edge[i].wei
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,inf=1e9;
int S,T,ed_cnt=-,head[N],as,cur[N],dep[N],p,q,r,d;
int mov_x[]={,,,-},mov_y[]={,-,,};
struct ed{int to,nxt,wei;}edge[N<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int nam(ri x,ri y,ri z){return ((x-)*q+y-)*r+z;}
il void print(ri dat)
{
if(!dat)return void(printf("0 , 0 , 0"));
if(dat==p*q*r+)return void(printf("0 , 0 , 0"));
ri z=dat%r;if(!z)z+=r;dat-=z;dat/=r;dat+=;
ri y=dat%q;if(!y)y+=q;dat-=y;dat/=q;dat+=;
ri x=dat;
printf("%d , %d , %d",x,y,z);
}
il void ad(ri x,ri y,ri z)
{
//printf("(");print(y);printf(") -> (");print(x);printf(") : %d\n",z);
//printf("%d -> %d : %d\n",y,x,z);
edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty()){ri nw=Q.front();Q.pop();e(i,nw)if(w(i) && !dep[t(i)])dep[t(i)]=dep[nw]+,Q.push(t(i));}
return dep[T];
}
il int dfs(ri nw,ri flow)
{
if(nw==T || !flow)return flow;ri ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+)
{ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
return ret;
}
il int dinic(){ri ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;} int main()
{
//freopen("3227.in","r",stdin);freopen("3227.out","w",stdout);
memset(head,-,sizeof(head));p=read();q=read();r=read();d=read();S=;T=p*q*r+;
rp(i,,p)rp(j,,q){ad(nam(i,j,),S,read());}
rp(k,,r){rp(i,,p)rp(j,,q)ad(nam(i,j,k),nam(i,j,k-),read());}
rp(i,,p)rp(j,,q)ad(T,nam(i,j,r),inf);
rp(i,,p)
rp(j,,q)
rp(t,,)
{
ri to_x=i+mov_x[t],to_y=j+mov_y[t];
if(!to_x || !to_y || to_x>p || to_y>q)continue;
rp(k,,r)
{
ri tmp=k-d;if(tmp>){ad(nam(to_x,to_y,tmp),nam(i,j,k),inf);}
tmp=k+d+;if(tmp<=r){ad(nam(i,j,k+),nam(to_x,to_y,tmp),inf);}
}
}
printf("%d\n",dinic());
return ;
}

洛谷$P3227\ [HNOI2013]$切糕 网络流的更多相关文章

  1. [洛谷P3227][HNOI2013]切糕

    题目大意:有一个$n\times m$的切糕,每一个位置的高度可以在$[1,k]$之间,每个高度有一个代价,要求四联通的两个格子之间高度最多相差$D$,问可行的最小代价.$n,m,k,D\leqsla ...

  2. 洛谷 P3227 [HNOI2013]切糕(最小割)

    题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...

  3. 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  4. 洛谷P3227 切糕

    最小割模板. 题意:你要在一个三维点阵的每个竖条中删去一个点,使得删去的点权和最小. 且相邻(四联通)的两竖条之间删的点的z坐标之差的绝对值不超过D. 解: 首先把这些都串起来,点边转化,就变成最小割 ...

  5. 【洛谷 P3227】 [HNOI2013]切糕(最小割)

    题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...

  6. 【bzoj3144】[Hnoi2013]切糕 网络流最小割

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

  7. P3227 [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  8. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  9. 洛谷P1251 餐巾(网络流)

    P1251 餐巾 15通过 95提交 题目提供者该用户不存在 标签网络流贪心 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 为什么我全部10个测试点都对… 题目描述 一个餐厅在相继的N天里 ...

随机推荐

  1. 《C语言深度解剖》学习笔记之关键字

    第一章 关键字 C语言共有32个关键字. 关键字   auto 声明自动变量 int 声明整型变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整 ...

  2. There is no getter for property named 'XXX' in 'class java.lang.String'

    实验环境:spring boot+mybitis 由于采用的不带映射xml文件的模式,因此 方法1: 把#{xxx}修改为 #{_parameter} 即可 select count(*) from ...

  3. lualatex+Beamer生成ppt

    直接放模板代码 \documentclass{beamer} % There are many different themes available for Beamer. A comprehensi ...

  4. [转]Netty实现原理浅析

    Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章netty使用初步.本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 ...

  5. JS 动态表格

    表格 在script里面使用innerHTML获取标签体的内容,然后进行添加. 删除则是不断的获取父节点,利用父节点删除子节点. 在做这个的时候,要主要获取表格table的对象有两种方式,一是getE ...

  6. 微信小程序下拉刷新 并重新加载数据

    1.在json页面配置: { "enablePullDownRefresh": true } 2.调用刷新函数 onPullDownRefresh: function() { wx ...

  7. axios 跨域

    {     headers:{"Content-Type":"application/x-www-form-urlencoded;charset=utf-8"} ...

  8. 【t013】无聊的军官

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 每个学年的开始,高一新生们都要进行传统的军训.今年有一个军训教官十分奇怪,他为了测试学员们的反应能力,每 ...

  9. [转]WebApi 后端文件传输至远程服务器

    /* 功能说明:微信退款需要有数字证书,而我们公司是做小程序平台的,会帮商家自动退款,所以会要求商家把微信证书上传至我们服务器,以便 微信退款. 使用HttpPostedFile 接受前端上传的文件, ...

  10. 【7003】&&【a203】合并多项式

    Time Limit: 3 second Memory Limit: 2 MB 问题描述      求两个一元多项式的和.输入多项式方式为:多项式项数.每项系数和指数,按指数从大到小的顺序输入.输出多 ...