【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.csdn.net/zarxdy34/article/details/45272055

经典的有距离限制的网络流模型。

首先我们不考虑高度限制。我们直接将图建\(r+1\)层,就是每个格子\((x,y)\)拆成\(r+1\)个点。将它们串成一串,第\(i\)层的向\(i+1\)层连边,第\(i\)条边的容量就是\(v_{x,y,i}\)。然后源点向第\(1\)层的连边,第\(r+1\)层的向汇点连边。最小割就是答案。

考虑怎么将距离限制表示出来。对于所有的格子\((x,y)\),假设是第\(k\)层的图,那么我们向第\(k-d\)层的\((x,y)\)周围的点连\(\infty\)的边。

考虑这么做的合法性。两个相邻的格子\((x,y),(x',y')\),如果我们选了\(v_{x,y,k}\),也就是割断了第\(k\)层\((x,y)\)连出去的边,那么\((x',y')\)选的高度\(k'\)要\(\geq k-D\)。如果\((x',y')\)割断了\(k-D\)以下的边,那么\((x,y)\)和\((x',y')\)之间\(\infty\)的边就会实源点和汇点连通。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 45 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const int V=N*N*N;
int n,m,r;
int D;
int v[N][N][N];
int id[N][N];
struct road {
int to,next;
int flow;
}s[V<<3];
int h[V],cnt=1;
void add(int i,int j,int f) {
s[++cnt]=(road) {j,h[i],f};h[i]=cnt;
s[++cnt]=(road) {i,h[j],0};h[j]=cnt;
}
int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int S,T;
int dis[V];
queue<int>q;
bool bfs() {
memset(dis,0x3f,sizeof(dis));
q.push(S);
dis[S]=0;
while(!q.empty()) {
int v=q.front();
q.pop();
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]>dis[v]+1) {
dis[to]=dis[v]+1;
q.push(to);
}
}
}
return dis[T]<1e9;
} int dfs(int v,int maxf) {
if(v==T) return maxf;
int ret=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]==dis[v]+1) {
int dlt=dfs(to,min(maxf,s[i].flow));
s[i].flow-=dlt;
s[i^1].flow+=dlt;
ret+=dlt;
maxf-=dlt;
if(!maxf) return ret;
}
}
return ret;
} int dinic() {
int ans=0;
while(bfs()) {
while(1) {
int tem=dfs(S,1e9);
if(!tem) break;
ans+=tem;
}
}
return ans;
} int main() {
n=Get(),m=Get(),r=Get();
D=Get();
for(int k=1;k<=r;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
v[i][j][k]=Get();
int tot=n*m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
id[i][j]=(i-1)*m+j;
T=(r+1)*tot+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
add(S,id[i][j],1e9),add(id[i][j]+r*tot,T,1e9); for(int k=1;k<=r;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
add((k-1)*tot+id[i][j],k*tot+id[i][j],v[i][j][k]);
if(k>D) {
int nxt=k-D;
for(int d=0;d<4;d++) {
int a=i+dx[d],b=j+dy[d];
if(a<1||a>n||b<1||b>m) continue ;
add((k-1)*tot+id[i][j],(nxt-1)*tot+id[a][b],1e9);
}
}
}
}
}
cout<<dinic();
return 0;
}

【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. bzoj千题计划142:bzoj3144: [Hnoi2013]切糕

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

  5. 【BZOJ3144】[HNOI2013]切糕

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

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

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

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

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

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

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

  9. 3144: [Hnoi2013]切糕

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

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

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

随机推荐

  1. C#与C++数据类型比较及结构体转换[整理]

    //c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)  ...

  2. Java爬虫框架Jsoup学习记录

    Jsoup的作用 当你想获得某网页的内容,可以使用此框架做个爬虫程序,爬某图片网站的图片(先获得图片地址,之后再借助其他工具下载图片)或者是小说网站的小说内容 我使用Jsoup写出的一款小说下载器,小 ...

  3. hihoCoder编程练习赛52

    题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...

  4. 淘宝cnpm

    npm install -g cnpm --registry=https://registry.npm.taobao.org

  5. Android tabLayout+recyclerView实现锚点定位

    原文链接:https://mp.weixin.qq.com/s/L3o2i3WTmg1ScXEYDS8YCg 在上一篇文章 Android 实现锚点定位中,我们介绍了tablayout+scrollV ...

  6. Android为TV端助力 MVP设计模式!

    实现原理: MainActivity 用来更新UI,和显示业务逻辑的结果! LoginPresenterCompl 用来处理 业务逻辑 ILoginPresenter 业务处理类抽象出来的接口 ILo ...

  7. vertical-align属性探究

    在前端开发中我们经常需要将元素垂直居中对齐,我们很自然的想到使用vertical-align属性,但是使用后却发现有时候能起作用,有时候却又不起作用.究其原因还是因为我们没有将vertical-ali ...

  8. 微服务扩展新途径:Messaging

    [编者按]服务编排是微服务设置的一个重要方面.本文在利用 ActiveMQ 虚拟话题来实现这一目标的同时,还会提供实用性指导.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 目前,微服务使用 ...

  9. ajax调用WebService实现数据库操作

    首先说下测试环境和思路: 前端收集数据转换成json格式传输到后端,处理并存入数据库 1.数据库操作: [WebMethod] public string InsertPoint(string dat ...

  10. 区块链会与io域名有什么关系

    为什么区块链会与io域名有这么大的联系? 近几年,区块链成为各国央行到国内外各大商业银行.联合国.国际货币基金组织到许多国家政府研究机构讨论的热点,"区块链+"应用创新正在成为引领 ...