BZOJ3144 Hnoi2013 切糕


Description

Input

第一行是三个正整数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

仅包含一个整数,表示在合法基础上最小的总不和谐值。

Sample Input

2 2 2

1

6 1

6 1

2 6

2 6

Sample Output

6

HINT

最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1


震惊,加边写错了导致调了40分钟

然后这题是一个比较经典的网络流建模

我们可以把相邻的两个纵向的R轴抽象成两条线,然后我们需要在这两条线上各割掉一条边且这两条边的位置不能差D

然后考虑建模

对于一个点Z,连一条到Z-D流量INF的边

如图



然后就可以发现如果在另一个线段上割掉的不是[Z-D,Z+D]区间的是不会成功地割掉一条边的

所以就这样建模

注意题目中RPQ的顺序,贼坑


#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 70000
int P,Q,R,D;
int val[45][45][45];
int mx[4]={0,0,1,-1};
int my[4]={1,-1,0,0};
namespace Dinic{
struct Edge{
int u,v,cap,flow;
Edge(int u,int v,int cap,int flow):u(u),v(v),cap(cap),flow(flow){}
};
int s,t;
int vis[N],d[N];
vector<Edge> E;
vector<int> g[N];
void add(int u,int v,int cap){
E.push_back(Edge(u,v,cap,0));
E.push_back(Edge(v,u,0,0));
int m=E.size();
g[u].push_back(m-2);
g[v].push_back(m-1);
}
bool bfs(){
static queue<int> q;
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
while(!q.empty())q.pop();
q.push(s);
d[s]=1;vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<(int)g[u].size();i++){
Edge e=E[g[u][i]];
if(e.cap>e.flow&&(!vis[e.v])){
vis[e.v]=1;
d[e.v]=d[u]+1;
q.push(e.v);
}
}
}
return vis[t];
}
int dfs(int u,int a){
if(u==t||(!a))return a;
int flow=0;
for(int i=0;i<(int)g[u].size();i++){
Edge &e=E[g[u][i]];
if(d[e.v]!=d[u]+1)continue;
int f=dfs(e.v,min(a,e.cap-e.flow));
if(!f)continue;
e.flow+=f;
E[g[u][i]^1].flow-=f;
a-=f;
flow+=f;
if(!a)return flow;
}
if(!flow)d[u]=0;
return flow;
}
int Max_flow(){
int flow=0;
while(bfs())flow+=dfs(s,INF);
return flow;
}
int getid(int z,int x,int y){return (x-1)*Q+y+z*P*Q;}
void build(){
s=0;t=(R+1)*P*Q+1;
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)add(s,getid(0,j,k),INF),add(getid(R,j,k),t,INF);
for(int i=1;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)add(getid(i-1,j,k),getid(i,j,k),val[i][j][k]);
for(int i=D;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)
for(int l=0;l<=4;l++){
int nx=j+mx[l],ny=k+my[l];
if(nx<1||nx>P||ny<1||ny>Q)continue;
add(getid(i,j,k),getid(i-D,nx,ny),INF);
}
}
void solve(){
scanf("%d%d%d",&P,&Q,&R);
scanf("%d",&D);
for(int i=1;i<=R;i++)
for(int j=1;j<=P;j++)
for(int k=1;k<=Q;k++)
scanf("%d",&val[i][j][k]);
build();
printf("%d",Max_flow());
}
};
int main(){
using namespace Dinic;
solve();
return 0;
}

BZOJ3144 Hnoi2013 切糕 【网络流】*的更多相关文章

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

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

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

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

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

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

  4. Bzoj3144 [Hnoi2013]切糕

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

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

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

  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]切糕 【最小割】

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

  8. 洛谷$P3227\ [HNOI2013]$切糕 网络流

    正解:网络流 解题报告: 传送门! 日常看不懂题系列,,,$QAQ$ 所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$ ...

  9. [BZOJ3144][HNOI2013]切糕(最小割)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3144 分析:神题不解释 http://www.cnblogs.com/zig-zag/ ...

随机推荐

  1. 创建Jmeter中使用的jar包中的工具类方法

    1. 在IDEA中新建一个maven工程. 2. 编写工具类方法,如加密算法.此处以加法为例. package DemoTest; public class DemoClass{ public int ...

  2. R 中的哪些命令或者包让你相见恨晚?--转载知乎

    https://www.zhihu.com/question/24501195 节选: 看了这么多答案,觉得 Hadley Wickhamhad.co.nz 在R使用者的地位好高啊.其实我也觉得Had ...

  3. [转载]Eclipse的常用快捷键

    常用的快捷键 ctrl+1:快速修复错误 ctrl+shift+L :查看快捷键 alt+?或alt+/:自动补全代码或者提示代码 ctrl+o:快速outline视图 ctrl+shift+r:打开 ...

  4. 解决httpclient请求响应压缩文本乱码问题

    最近在调用京东的获取省份接口老是中文乱码,加了utf-8也没有用.最后在httpclient打的日志中有Content-Encoding:gzip信息,最后在请求header里加上: reqHeade ...

  5. Hystrix的正确理解方式

    hystrix-logo-tagline-640.png 什么是熔断器 熔断器,原本是电路中在电器发生短路时的防止电路过载的开关装置,它切断发生短路的电路,从而防止因电路过载导致的发热起火等灾难的发生 ...

  6. pandas的常用函数

    1.DataFrame的常用函数: (1)np.abs(frame) 绝对值, (2)apply function, lambda f= lambda x: x.max()-x.min(),frame ...

  7. 设计模式--备忘录模式C++实现

    备忘录模式C++实现 1定义Memento pattern 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先的状态 2类图 3实现 clas ...

  8. SpringIOC源码分析总结

    大致的加载过程: spring ioc容器的加载,大体上经过以下几个过程: 资源文件定位.解析.注册.实例化 1.资源文件定位:主要发生在ApplicationContext中,由于applicati ...

  9. Hibernate[延迟加载] [三种状态] [脏检查] [缓存机制]

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  10. IOS-启动图和开屏广告图,类似网易

    作者:若锦 原文链接:http://www.jianshu.com/p/e52806516139 启动图是在iOS开发过程中必不可少的一个部分,很多app在启动图之后会有一张自定义的开屏广告图,点击该 ...