题目描述

  • 哎,这又是网络流?自闭了。
  • 先考虑只有一个限制条件的情况,求最小收益,转化到求最小割上面。
  • 这张图相当于我们把题中的n*m条链抽出来两条,考虑如何通过巧妙地建图,实现对条件的限制。
  • 假如我们有这样一个限制:如果选择了2号点,那么只能选择8~10号点。选择一个点,在图中对应割掉一条边。最小收益我们已经转化为求最小割,考虑增加什么样的边,可以使新图跑最小割的过程中同时满足限制。如果,从2到8号点连一条容量为inf的边,那么假如割掉了2—>3这条边,那么一定会从蓝色的边中割掉一条。这样,通过一条边,我们达到了对后缀的限制。如果是一个可行区间,再从下面的链向上连一条边不就好了?
  • 因此,我们己经会了两条链的情况。本题同样如此,只不过是n*m条链。每条链都这样处理,一条链上相邻点连边的容量为点权,s到第0层的点连容量inf的边,最后一层向t连容量为inf的边。跑最小割即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define rint register int
using namespace std;
const int N=45*45*45+10;
const int M=3e5+10;
const int inf=1e9;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
int P,Q,R,D,s,t,tot=1,ver[M<<1],Next[M<<1],lin[N],edge[M<<1],d[N],v[41][41][41],flow,maxflow;
int cal(int i,int j,int k){return i*P*Q+j*Q+k;}
void add(int x,int y,int z){ver[++tot]=y;Next[tot]=lin[x];lin[x]=tot;edge[tot]=z;ver[++tot]=x;Next[tot]=lin[y];lin[y]=tot;edge[tot]=0;
}
void init(){scanf("%d%d%d%d",&P,&Q,&R,&D);s=N-2,t=N-1;for(int i=1;i<=R;++i) for(int j=1;j<=P;++j) for(int k=1;k<=Q;++k) scanf("%d",&v[i][j][k]);for(int i=1;i<=P;++i) for(int j=1;j<=Q;++j) add(s,cal(0,i,j),inf),add(cal(R,i,j),t,inf);for(int i=1;i<=R;++i) for(int j=1;j<=P;++j) for(int k=1;k<=Q;++k) add(cal(i-1,j,k),cal(i,j,k),v[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 t=0;t<4;++t){int tx=j+dx[t],ty=k+dy[t];if(tx<1||tx>P||ty<1||ty>Q) continue;add(cal(i,j,k),cal(i-D,tx,ty),inf);}}
}
bool bfs(){memset(d,0,sizeof(d));queue<int>q;d[s]=1,q.push(s);while(q.size()){int x=q.front();q.pop();for(int i=lin[x];i;i=Next[i]){int y=ver[i];if(!d[y]&&edge[i]){d[y]=d[x]+1;q.push(y);if(y==t) return 1;}}}return 0;
}
int dinic(int x,int flow){if(x==t) return flow;int rest=flow;for(int i=lin[x];i&&rest;i=Next[i]){int y=ver[i];if(edge[i]&&d[y]==d[x]+1){int k=dinic(y,min(edge[i],rest));if(!k) d[y]=0;rest-=k;edge[i]-=k;edge[i^1]+=k;if(!rest) return flow-rest;}}return flow-rest;
}
void work(){while(bfs()){while(flow=dinic(s,inf)) maxflow+=flow;}cout<<maxflow<<endl;
}
int main(){init();work();return 0;
}

[BZOJ3144]切糕相关推荐

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

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

  2. 【BZOJ3144】【HNOI2013】切糕(网络流)

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

  3. bzoj3144: [Hnoi2013]切糕(最小割)

    传送门 据说这玩意儿叫切糕模型? 我们可以看做有$P*Q$个网格,每个格子有$R$个点,在每一个格子中选一个点,且相邻的点距离不能超过$d$,求最小代价 考虑如果没有限制条件怎么做.我们可以把每一个网 ...

  4. bzoj3144 [Hnoi2013]切糕

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

  5. [bzoj3144]【HNOI2013】切糕

    Description 表示语文不好,看了好久才看懂题. 化简之后的题意大概是这样的:给出一个P*Q的网格,在(x,y)放一个数字z(1<=z<=R)的代价是v(x,y,z),并且四相邻中 ...

  6. bzoj-3144 [Hnoi2013]切糕

    3144 [Hnoi2013]切糕 题目链接 题目大意 给出一个立方体(长宽高分别P,Q,R),按三维坐标每个点记作(x,y,z),点权为V(x,y,z),对于x,y位置从上到下有z层,但只能选择一层 ...

  7. BZOJ3144: [Hnoi2013]切糕

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3144 把每一条z轴都拿出来,s->(x,y,1),c=f[x][y][1];(x,y,k ...

  8. BZOJ3144【HNOI2013】切糕

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3144 [分析] 所有人都说这是个经典的最小割模型......蒟蒻泪流满面...... 建一 ...

  9. BZOJ 3144 [Hnoi2013]切糕

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

  10. 刘宇凡:数字让切糕与电商溅起涟漪

    最近都没怎么写文章了,感觉好累.可能是每一个互联网人士到了一定的时间都会有一个过渡期吧,也许,我来的比别人快了一步.或许这就是人们所说的,每个月总有那么一次.最近天气也转冷了,手都冰冷冰冷的,打字都放 ...

最新文章

  1. 注入Attention,精度涨30%!谷歌发表最新多目标“动态抠图”模型
  2. string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
  3. surface pro linux服务器,【如何在surface pro 4上安装linux系统?】-看准网
  4. 在Matlab符号计算中灵活运用assume
  5. 第八章《对象引用、可变性和垃圾回收》(上)
  6. jQuery初识和常用事件(一)
  7. 菜鸟学习笔记:Java提升篇11(Java动态性1——注解与反射)
  8. java实现rabbitmq任务模型(work queues), 生产者 消费者 消息队列 能者多劳
  9. ElementUI:table获取复选中的数据
  10. initcall机制原理及实践
  11. 杀毒软件 McAfee 创始人狱中身亡,75 年传奇人生画下句号
  12. 微信小程序的学习资料销售平台
  13. scada系统集成_MES与EPR进行系统集成的实际案例-系统接口、交互数据分析
  14. NO JVM installation found. please install a 64-bit JDK,解决方法   Error launching android studio   NO J
  15. 破解使用radius实现802.1x认证的企业无线网络
  16. 【存储】存储基本概念(lun,volume,HBA,DAS,NAS,SAN,iSCSI,IPSAN、存储池和存储卷)
  17. 学习日记5-C语言函数的应用
  18. java——Random种子
  19. 智能搬运机器人系列之使用旭日X3派实现机器人防脱轨功能
  20. Java爬取12306

热门文章

  1. 无法上网的N种解决方法
  2. 利用python进行假设检验
  3. matlab plotyy 横坐标,[转载]关于plotyy的坐标轴 设置
  4. 外贸常用术语_外贸常用句子
  5. C语言实现2048游戏(分文件编译)
  6. 计算机桌面文件为何不能剪贴,电脑不能复制粘贴是什么原因【方法介绍】
  7. 个人计算机键盘上的按键击键声音小,电脑键盘按键会双击怎么办
  8. 计算机主机光盘故障,光驱常见故障及解决办法
  9. Aho - Corasick string matching algorithm
  10. android版本内存卡,版本等级繁多 教你如何挑选手机内存卡