做题记录 25.4.2:网络流专题

\(\textcolor{black}\odot\) P4298 [CTSC2008] 祭祀 无 spj

先传递凸包,转化为求 \(\text{DAG}\) 的最大独立集,直接流即可,时间复杂度 \(O(n^2\sqrt n)\)

代码

\(\textcolor{purple}\odot\) P3227 [HNOI2013] 切糕

广义切糕模型模板

代码

参考

\(\textcolor{purple}\odot\) P3308 [SDOI2014] LIS

\(dp_i\) 表示 \(a_{1\sim i}\)\(\text{LIS}\),每个 \(i\) 拆为入点 \(in_i\) 和出点 \(out_i\)\(S\)\(dp_i=1\)\(in_i\) 连容量 \(\infty\) 的边,\(dp_i=\max dp_i\)\(out_i\)\(T\) 连容量 \(\infty\) 的边,\(j<i,a_j<a_i,dp_j=dp_i-1\)\(out_j\)\(in_i\) 连容量 \(\infty\) 的边,\(in_i\)\(out_i\) 连容量 \(b_i\) 的边,则图的最小割为第一问的答案

第二问相当于求字典序最小的最小割

\(c\) 从小到大枚举每条 \(in_i\to out_i\) 的边,若残量网络中两点之间不连通,则删去这条边,还原剩余边的流量后跑一次最大流

最后将选出的边排序即可

显然得到的序列排序后字典序最小

时间复杂度 \(O(n^4)\)

代码

参考

\(\textcolor{black}\odot\) AT_arc161_f [ARC161F] Everywhere is Sparser than Whole (Judge)

任意的真导出子图的密度都 \(<d\),等价于判断原图的最大密度真子图是否 \(<d\)

\(n\times d\) 条边分别建立一个左部点,\(n\) 个点分别建立一个右部点,左部点向右部中两个端点对应点连边

则原图的导出子图为新图的闭合子图

先判断原图的最大密度真子图是否 \(>d\)

\(\frac{|E|}{|V|}>d\iff |E|-d|V|>0\),左部点赋权 \(1\),右部点赋权 \(-d\),则转化为判断图的最大权闭合子图是否 \(>0\)(显然一定为真子图),若满足则原图一定不合法

具体实现为源点向所有左部点连容量 \(1\) 的边,二分图中的边容量为 \(\infty\),右部点向汇点连容量 \(d\) 的边,若 \(n\times d\) 减去最大流 \(>0\) 则原图不合法

然后判断原图的最大密度真子图是否 \(=d\),此时不能套用之前的方法,因为全图的密度等于 \(d\),需要消除其影响

假设存在一个真子图的密度 \(=d\),则在新图上其点权和为 \(0\),设其中有 \(x\) 个右部,则包含 \(xd\) 个左部点,且子图为封闭的

显然这 \(xd\) 个左部点以外的左部点不会连向这 \(x\) 个右部点,这 \(xd\) 个左部点也不会连向这 \(x\) 个右部点以外的右部点

因此选出的必然为原有向二分图的一个弱连通块

此时显然有之前建出的网络满流,因此残量网络上源点、汇点、中间部分形成独立的三部分

而中间部分的每条边正向反向都有流量

因此转化为残量网络上一个不同于 \(\{S\}\)\(\{T\}\) 的强连通块

若中间部分只有一个强连通块,即整张残量网络只有三个强连通块,则无法选出一个密度为 \(d\) 的真子图,即原图合法

否则原图不合法

时间复杂度 \(O((nd)^{1.5})\)

代码

参考

UOJ #168. 【UR #11】元旦老人与丛林

可证图合法当且仅当任意非空子图 \(G'=(E',V')\) 满足 \(|E'|\le 2|V'|-2\)

建立二分图,左部点对应每条边,右部点对应每个点,左部向端点对应右部点连边,左部点点权为 \(1\),右部点点权为 \(-2\),则等价于二分图的最大权非空封闭子图的权值和 \(\le -2\)

常规的方式无法处理非空的情况

需要枚举删去的一个点,转化为最大权子图权值和 \(=0\),若存在一个点使得权值和 \(>0\) 则不合法

时间复杂度为 \(O(nm\sqrt m)\)

发现相邻两次之间只有两条容量为 \(2\) 的边不同

因此开始时计算一次最大流,对于每个点,退回它和 \(T\) 之间边的流量后把它删去再跑一次最大流,若流量非空则不合法,然后补回删去的边

这样时间复杂度可到 \(O(m\sqrt n+nm)\)

代码

参考

QOJ # 6508. This is not an Abnormal Team!

先进行二分图匹配,然后尽量将未匹配点与匹配点组合形成三元素集合(一个未匹配点与一组匹配组合),显然最优且合法

考虑如何使用网络流实现这一过程

先建出二分图对应的网络,计算出最大流,此时的最大流为 答案中二元素集合和三元素集合的数量之和

删除源点连向已匹配左部点的边,删除未匹配右部点连向汇点的边,然后再跑一次最大流,得到的结果为 含两个左部点一个右部点的三元素集合数量

删除与源汇直接相连的所有边,此时剩下的边要么是匹配边,要么组成三元素集合(以下认为组成三元素集合的边不再为匹配边

对于每个右部点,求出剩余的边中与它相连的数量,显然为 \(0/1/2\),若为 \(0\) 则表示未匹配,若为 \(1\) 则表示为匹配边一端,若为 \(2\) 则表示在三元素集中

源点向匹配边左部点连边,未匹配点向汇点连边,再跑一次最大流,得到的结果为 含两个右部点一个左部点的三元素集合数量

得到这三个量后容易求出答案

时间复杂度 \(O(m\sqrt n)\)

代码

参考

posted @ 2025-04-02 19:52  Hstry  阅读(6)  评论(0)    收藏  举报