网络流

最大流

\(dinic\) 网络流复杂度为 \(O(n^2m)\)(目前出了预流推进模板还没有被卡过)


P2472 [SCOI2007] 蜥蜴

这道题里可以很自然地想到一只蜥蜴就是 \(1\) 的流量,而石柱的限制很自然就成为了边的容量
可以说这就是最朴素的网络流,只是把模型套了个背景而已


P2766 最长不下降子序列问题

首先把 \(dp\) 数组跑出来可以得到第一问
可以发现一次 \(dp\) 的转移相当于一条边,而经过若干次边的一条路径即是一条 \(LIS\)
但是应当保证其长度为 \(s\),那么只需要保留最优转移即可,可以发现这类似于形成了一个分层图,而每一层的 \(dp\) 值一样,而只有第一层连向源点,最后一层连向汇点
第二问为了限制只能用一次,每个点拆点连 \(1\) 的流量,第三问把 \(1\) 号和 \(n\) 给成 \(inf\) 流量即可

image

  • \(dp\) 后跑网络流是一个很常见的套路,\(dp\) 的转移是非常自然的连边,这一套路后面可以多次见到
  • 限制每个点的使用/经过次数可以使用拆点的套路
  • 分层的思想在网络流中很常见,这样类似于给 \(dp\) 加状态

P2754 [CTSC1999]家园 / 星际转移问题

每个太空站都要看成点,那么飞船就是它们之间的边
可以发现这样画出来的图肯定不对,原因在于忽略了时间的存在
很自然地想到再加一维时间,相当于是每一时刻为“一层”
时间不必二分,直接每次添加一层然后跑继续增广即可

image

  • 此题即为分层图的典例

P5029 T'ill It's Over

本来想拆点,发现没有必要,所有节都是无差别的,把节数当成流量即可
然后对于区间向区间的连边,使用线段树优化建图解决

image


二分图与匹配

一些纯二分图问题在 这里

  • 最小点覆盖=最大匹配

构造方式:从未匹配的右部点出发走交错路(即右向左走非匹配边,左向右走匹配边),标记路径上所有点
最终被标记的左部点+未标记的右部点为最小点覆盖

  • 最大独立集=总点数-最小点覆盖

构造方式:容易发现等式中如果都换成集合同样成立

注意 \(dinic\) 跑二分图匹配是 \(m\sqrt{n}\) 的,因此发现边数 \(1e5\) 的时候不用慌

二分图建模时要寻找左右部点的实际含义的是什么,并根据问题确定需要求解哪类问题


P4251 [SCOI2015]小凸玩矩阵

首先二分,找到了符合条件的那些点
然后行列看成左右部点进行匹配即可

  • 二分+匹配是绝配
  • 格点问题经常可以转化为二分图

这个这个 都很类似,不写了


CF546E Soldier and Traveling

由于限制了只能去往相邻点,考虑拆点限制
这样做的好处是可以严格保证每个点只扩展一次
其实这个更类似于分层图,如果限制扩展两次那么再加一层即可

image


P4382 [八省联考 2018] 劈配

学生的话肯定是候选项一个一个加,如果可行则把这个候选项的边都加进去用作退流
第二问相当于是需要二分前缀然后在这个前缀的图上继续跑 \(check\) 是否满足
在这种问题下似乎匈牙利会快且自然一些
\(dinic\) 需要注意如果一些边不需要需要及时删除

可以发现今年的网络流有灵活化的趋势,并不是简单建出图就能求得答案的那种


最小割

“用最小的费用将对象划分成两个集合的问题,常常可以转换成最小割后顺利解决”

  • 模型:每个物品有两种状态选与不选,并分别有代价 \(a_i,b_i\),物品之间有差异选择的代价,求最小代价

可以设 \(S\) 表示点选,\(T\) 表示点不选,那么从 \(S\) 向物品连接不选的代价,可以发现割掉和 \(T\) 相连的边表示这个物品选择,那么就有 \(S\)\(i\) 的流量,这正好符合我们的要求
同时直接从 \(i\)\(j\) 连接差异代价,因为如果 \(i\) 选且 \(j\) 不选的时候正好这条边是有流量的,那么必须割掉,就计算到了代价

image

这里有简化模型
这个也是一样的道理


P1361 小M的作物

这次相比多了个集合的限制
那么把集合也建出点来,并对其管辖的点连 \(inf\) 的边
此时可以刻画出“集合中一个不选,集合必须不选”的限制条件


P2774 方格取数问题

建出二分图,那么源向点和点向汇的边都可以表示权值,最小割即可


P5039 [SHOI2010]最小生成树

一条边被计入最小生成树,当且仅当把小于等于它的边加入后两端点不连通,这个自然就可以和最小割联系起来
那么把这条边的两个端点作为源汇点,对其他边跑最小割即可


P3227 [HNOI2013]切糕

这个最小割也是非常形象的,题意本来就是要割开的
考虑怎样限制相邻之差
其核心就是让差大于 \(D\) 的割不掉,反映在最小割上就是连 \(inf\)

image


有向图最小路径覆盖

最小路径数=总点数-最大流(构造)
把原图中的每个点拆成两个点,从原点向每个点、每个点向汇点分别连流量为1的边
对于一条边 \((u,v)\),建图连 \((u,v')\)流量为1的边
那么跑一遍二分图匹配,匹配上的一对点相当于选中了原图中的一条边,那么每选中一条边相当于联通块合并数目减少一个
那么最后联通块的数量即为路径数量

对于点可以重复覆盖的情况,可以跑 \(floyd\) 处理出所有可以到达的点对然后按原来处理


P2765 魔术球问题

把每个球当做点,拼凑关系作为边,柱子作为路径,一个一个添加点直到路径个数不再满足条件


P2172 [国家集训队]部落战争

部队与格点分别当做路径和点,由于只能向下走是 \(DAG\) 直接跑即可


P4589 [TJOI2018]智力竞赛

二分答案后变成了可重复覆盖路径问题,跑 \(floyd\) 处理即可


P2469 [SDOI2010]星际竞速

这道题相当于是升级版
首先代价不为1需要升级成费用流,然后类似建边
但是能力爆发模式就比较头大
那么可以这样来处理:由源点向所有所有拆出的点连 \((0,a_i)\) 的边表示爆发


最大闭合子图

对于一个有向图有限制如果选一个点其能到达的点都必须选使得选出点的权值和最大
这样构造图:对于正权点从源点向其连边,负权点向汇点连其权值相反数的边,图中原有的边设为 \(inf\)
那么答案=正权点和-最小割(构造)

简单证明一下,按照表达式,最小割中割掉的是不选的正权点和选择的负权点,那么不管是选择的正权点连向正权点或正权点连向负权点的边不满足闭合子图的条件都与最小割相矛盾

对于输出方案,判断割没割即可


CF1082G Petya and Graph

选一条边一定要选两个端点,那么把边与点都当做点即可

这个模型太经典了,以至于再次出来还是不会……

元旦老人与丛林

经过一系列推导,得出的结论是需要满足不存在一个子图 \(|E|>2|V|-2\)
那么还是像上面一样,选择一条边一定选择两个顶点,边的点的权值为 \(-2\),边的权值为 \(1\)
现在需要判断最大闭合子图是否大于 \(-2\),这个直接跑是跑不出来负数的
那么强制选择两个点,加上退流操作后复杂度仍然正确


P3749 [六省联考 2017] 寿司餐厅

首先是对于贡献的处理
由于每个种类的贡献只算一次,满足闭合子图的定义,那么对于每个种类都来一个 \(-mx^2\) 的点作为贡献点,之后每一盘寿司的贡献即为 \(d_{i,i}-x\)
对于区间每个都连是不现实的,那么只对长度为 \(1\) 的区间对寿司连边,其余的 \([i,j]\)\([i+1,j]\)\([i,j-1]\) 连边,这样即可表示所有情况


P3872 [TJOI2010]电影迷

可以当做结论?对于带权有向图直接把边权建进图中跑最小割即可


上下界网络流

无源汇可行流

考虑一个合法流需要满足两个条件:对于每一个点流量守恒,即进入的流量等于流出的流量;流量限制,即每条边的不能流量不能超出限制

如果跑正常的网络流条件一很好满足,但条件二不能满足下界限制
那么优先去满足棘手的问题,通过把每天边设置初始流量为 \(l\),最大流量为 \(r-l\) 满足了条件二
这时条件一变得不满足,可以对于每一个点统计其相关边初始导致其流量不平衡的度数,由源汇点来补足
设出边为负入边为正,那么一个点度数为负相当于流出的多了,需要往汇点分担一些
如果为正相当于流入的多了,需要把多出来的那部分从源点获得补偿


有源汇可行流

需要保证可行流经过这个源汇,可以从 \(T\)\(S\) 连一条 \(inf\) 的边,相当于电池的电极,用这些电势驱动流量


有源汇最大流

直接在电池边的基础上跑最大流


有源汇最小流

首先跑最大流,然后删掉电池边反向最大流,可以使得差值最小


上下界费用流

直接改为费用流,注意将事先钦定的 \(l\) 的流量那部分费用算入其中


费用流

一类拆点费用流

P2045 方格取数加强版

这道题里点权是费用,要体现在边上,那么需要拆点,连边为权值
但是由于一个点取走后之后不能再取,那么流量设为1,再重新设一个流量为 \(k-1\) 但是没有费用的点
然后从起点向终点跑最大费用流即可


P4013 数字梯形问题

很类似的问题了,只不过三种情况分别讨论,不管是边还是点,如果只能经过1次则流量为1,可以重复经过则流量为正无穷

注意原图的左下对应到新图是正下!!!
注意数组开够,列是40的


CF818G Four Melodies

考虑 \(4\) 个互补相交,这个可以用流量限制,即用源点流量限制 \(4\) 这个总流量,每个数都拆点限制流量为 \(1\) 使得只经过一次
暴力的思想是对于后面的每个满足条件的点分别连边,但显然这样是 \(n^2\) 级别的
一个比较常见的套路是类似于路径压缩,开出一条路径,每个点只向其后面第一个满足条件的点连边,而路径上所有边都是 \((inf,0)\),相当于开了条快速路,没有任何阻力,可以随时上或下


P1251 餐巾计划问题

首先这么多奇奇怪怪的条件应该就是网络流,由于有餐巾作为流量价格作为花费出现二维变量考虑费用流
将每一天拆成两个点,分别表示这一天开始和这一天结束
然后把题目中的条件一一对应进去
由于每一天都会造出 \(x\) 个脏的餐巾,那么从源点向每一天晚上连一条 \((x,0)\) 的边
由于每天可以买进新的餐巾那么源点向每一天早上连一条 \((inf,p)\) 的边表示购进
为了保证每天早上有足够的餐巾纸那么每天早上向汇点连 \((x,0)\) 的边
由于每天的餐巾可以留着不洗直到作废那么向第二天晚上连 \((inf,0)\) 的边
对于送到洗衣房餐巾们会在那里呆 \(t\) 天于是从这一天晚上到 \(t\) 天后的早上连一条 \((inf,w)\) 的边


费用匹配

对于平常的二分图最大匹配附加上了权值,由最大流相应地进化到费用流
求最大完美匹配有基于匈牙利改造而来的 \(KM\) 算法有着更优秀的复杂度


P3967 [TJOI2014]匹配

直接按照输入建边即可,对于必经边枚举原匹配中每一条边,钦定这一对点不能连再跑一次即可


偏序集

偏序集相当于是对于有向图求了传递闭包后的状态
普通有向图的可重路径覆盖是相当于偏序集上的不重路径覆盖的
反链相当于是偏序集上的最大独立集
有定理最长反链=最小不重路径覆盖

建图直接左部点放出点,右边放入点即可
关于构造,一个非常神奇的方式是从未匹配的右部点开始 \(dfs\),只走有流量的边(右到左走非匹配边,左到有走匹配边),这样走完以后左边未被 \(dfs\) 到且右边被 \(dfs\) 到的是可以选的
相当于是选择了所有链结束的点,一定是最优的


P4298 [CTSC2008]祭祀

关键在于第三问
可以直接强制选这个点看会不会减少(注意强制选了以后它能到的和能到它的都不能用了)


CF590E Birthday

对于串的包含关系可以用 \(AC\) 自动机来解决
注意这里是不能在自动机上跳的,可以用并查集来维护
每个并查集的链顶是关键点,用 \(fail\) 树做并查集的转移,均摊下来是对的(但是并查集必须写成循环版才行……)


C. 卿且去

证明暂时没看懂,暂且当成结论吧
对于 \([1,2n]\) 的偏序集是选择 \([n+1,n]\) 最优


A. 前缀

证明还是没看懂,还是当成结论吧
将所有约数按照指数和分层,选择个数最多的层最优


杂题与套路

P3163 [CQOI2014]危桥

可以按照题意模拟连边,从源点向两个分源点分别连边,将往返变为单次,危桥经过一次
这样会出现两条路径交叉使用的情况,以及危桥重复经过的可能
神奇的是可以将第二个起点与终点交换位置再次验证
证明并不会


P3980 [NOI2008] 志愿者招募

想办法把这道题中的每天需要的志愿者数量嵌入到流量限制模型中
假设一开始是满流的,而每一天都减少 \(a_i\) 个,类似于河道变窄,那么上面来的水必须从支流走这相当于流经志愿者
一个志愿者相当于开设了一条从 \([l,r]\) 的支流河道,被 \(a_i\) 卡掉的水只能从那里走

这种反向思维着实巧妙


B. 【PR #1】守卫

首先可以证明最优情形所有边均在最小生成树上
并且排除不优答案后不用考虑有两个人在同一连通块中的情况,只需要保证每个连通块中有人即可
那么对这棵树做费用流:

image

其中 \(w\) 为连向父亲的边权,根节点为 \(inf\)


分层图建图

CF1187G Gang Up

发现每个点有时间这个属性,那么套路地对每个点按时间分层
每个人可以站在原地耗一分钟,也可以通过一条边
由于边每次的费用不一致,但递增的差量有单调性,那么把每条边拆成 \(k\) 条,边权为差量,每次每个人选择自然会自觉地从小到大经过这些边
注意除在 \(1\) 号点外每条边都会附加 \(c\) 的费用


混合图欧拉回路

对于一个其中一些边已经定向的混合图,可以这样来求欧拉路并构造方案:
首先对于自由边任意定向,统计出此时每个顶点的度数差(一定是偶数),设定向为 \((u,v)\),那么 \(v\)\(v\) 连接流量为 \(1\) 的边
对于每个顶点,如果为入度型,\(S\)\(i\) 连接 \(\frac{deg}{2}\) 的边
否则向 \(T\) 连接 \(\frac{deg}{2}\) 的边
跑完对于有流量的边反向
比较容易直观理解


染色建图

对于格子上的问题常常通过黑白染色等手段转化为网络流模型


B. marshland

由于是 \(L\) 型,那么染成九宫格形状


P3756 [CQOI2017]老C的方块

具体做法见题解区图片吧,脑洞着实比较大

posted @ 2021-06-23 22:14  y_cx  阅读(55)  评论(0编辑  收藏  举报