题目链接

没有\(D\)的限制怎么做?"最小"我们可以想到最小割,把同一纵轴上的点串起来,分别连到S,T,最小割就是答案。(在这把点权放到前一条边上)
有限制,即如果要割点\(i\),对于相邻纵轴只能去割\([i-D,i+D]\)。
用INF边限制住这个区间,即由\(i\)向\(i-D\)连,由\(i+D\)向\(i\)连。因为关系是双向的,只连一条就行了。

重新复习了下:x+D向另一行的x点连边,是表示,如果选了x,就不能选择另一行x+D右边的数了。
而且容易发现只连一条x+D到x的就够了(不需要x,x-D之间的)。

注意"割"是指这条边流量等于它,连INF边后选择不合法的边一定不会成为割,会通过INF边再流入/出。(理解为只割不合法边S,T仍连通也可以?反正就是我朝了)

//7036kb    832ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define MAXIN 200000
const int N=70005,M=N<<2;
const int way[5]={1,0,-1,0,1},INF=0x3f3f3f3f;int P,Q,R,D,src,des,Enum,cur[N],H[N],to[M],nxt[M],fr[M],cap[M],pre[N],num[N],lev[N],que[N];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=gc()) if(c=='-') f=-1;for(;isdigit(c);now=now*10+c-'0',c=gc());return now*f;
}
inline void AddEdge(int u,int v,int w)
{to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], cap[Enum]=w, H[u]=Enum;to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], cap[Enum]=0, H[v]=Enum;
}
inline int ID(int x,int y,int z){return z ? (z-1)*P*Q+(x-1)*Q+y : 0;
}
bool BFS()
{for(int i=src; i<des; ++i) lev[i]=des+1;lev[des]=0, que[0]=des; int h=0,t=1;while(h<t){int x=que[h++];for(int i=H[x]; i; i=nxt[i])if(lev[to[i]]==des+1 && cap[i^1])lev[to[i]]=lev[x]+1, que[t++]=to[i];}return lev[src]<=des;
}
int Augment()
{int mn=INF;for(int i=des; i!=src; i=fr[pre[i]]) mn=std::min(mn,cap[pre[i]]);for(int i=des; i!=src; i=fr[pre[i]]) cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;return mn;
}
int ISAP()
{if(!BFS()) return 0;for(int i=src; i<=des; ++i) ++num[lev[i]],cur[i]=H[i];int res=0,x=src;while(lev[src]<=des){if(x==des) x=src,res+=Augment();bool can=0;for(int i=cur[x]; i; i=nxt[i])if(lev[to[i]]==lev[x]-1 && cap[i]){can=1, cur[x]=i, pre[x=to[i]]=i;break;}if(!can){int mn=des;for(int i=H[x]; i; i=nxt[i])if(cap[i]) mn=std::min(mn,lev[to[i]]);if(!--num[lev[x]]) break;++num[lev[x]=mn+1], cur[x]=H[x];if(x!=src) x=fr[pre[x]];}}return res;
}int main()
{P=read(),Q=read(),R=read(),D=read(),Enum=1,src=0,des=P*Q*R+1;for(int p=1; p<=R; ++p)for(int i=1; i<=P; ++i)for(int j=1; j<=Q; ++j){AddEdge(ID(i,j,p-1),ID(i,j,p),read());if(p>D)for(int xn,yn,k=0; k<4; ++k)if((xn=i+way[k]) && (yn=j+way[k+1]) && xn<=P && yn<=Q)AddEdge(ID(i,j,p),ID(xn,yn,p-D),INF);}for(int i=1; i<=P; ++i)for(int j=1; j<=Q; ++j) AddEdge(ID(i,j,R),des,INF);printf("%d",ISAP());return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8697051.html

BZOJ.3144.[HNOI2013]切糕(最小割)相关推荐

  1. BZOJ 3144 [Hnoi2013]切糕

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

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

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

  3. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)

    题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...

  4. bzoj 3144: [Hnoi2013]切糕

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

  5. 3144: [Hnoi2013]切糕

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

  6. BZOJ 2039 人员雇佣 (最小割)

    题面:BZOJ传送门 网络流的题真神仙= = 大致分为三种情况 选某个人$i$,收益减少$a_{i}$ 选了$i$选了$j$,收益增加$2e_{ij}$ 选了$i$不选$j$,收益减少$e_{ij}$ ...

  7. ●BOZJ 3144 [Hnoi2013]切糕

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3144 题解: "这是一个经典的最小割模型" ---引用自别人的博客 .. ...

  8. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...

  9. bzoj 2007 [Noi2010]海拔——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...

最新文章

  1. linux内网机器访问外网代理设置squid
  2. 宁‘内卷‘,勿‘躺平‘
  3. hibernate+mysql保存中文数据乱码问题
  4. 微信为什么不进入鸿蒙生态,马化腾为何迟迟不将微信, 加入任正非的华为鸿蒙生态系统中呢?...
  5. mysql 数据库编程_MySQL数据库编程(C++语言)
  6. Android、Java验证手机号是否合法
  7. elasticsearch搜素关键字自动补全(suggest)
  8. 通过修改注册表设定浏览器的却省值
  9. linux修改windows注册表,妙招:让修改的注册表立即生效的几种方法
  10. Win11怎么打开以前的word文档
  11. android action bar 风格,自定义ActionBar的风格
  12. 使用 YOLOv5 训练自动驾驶目标检测网络
  13. oracle函数总结
  14. 02_使用jq实现进入和离开动画
  15. python递归函数的使用方法_让你Python到很爽的加速递归函数的装饰器
  16. JavaScript学习(二十三)—scrollTop练习
  17. 【NOIP2003】【Luogu1044】栈
  18. jenkins部署war包到容器(tomcat)
  19. Flink kafka source sink 源码解析
  20. 程序员相亲图鉴,太真实了!

热门文章

  1. rocketmq namesrv 第一章启动过程
  2. 【拾贝】hive unoin all map数爆增
  3. Python 2.7.X安装dpkt, sendpkt, pycap
  4. iphone 如何成功的把three20成功的添加到xcode中去。
  5. C++11 处理时间和日期的处理,以及chrono库介绍
  6. 问题 A: 百钱买百鸡问题
  7. Linux基础操作及命令管理
  8. Framework Ventures联合创始人:未来两年DeFi TVL将提升10倍
  9. SAP License:SAP HANA CLOUD MM 实施的坑
  10. SAP License:客户特别总帐统驭科目某天余额取数逻辑