网络流的一些模型

上下界网络流

link

无源汇有上下界可行流

没有源点和汇点,每条边都有一个流量的上限和下限 \([l,r]\),问是否存在一组可行流让网络平衡。
为了转化成我们熟悉的问题,可以把每条边都减去他们的下限 \(l\),那么流量限制就成了 \([0,r-l]\),变成一个差网络。再新建一个下界网络,每条边的容量都为他们的下界 \(l\),我们希望这两个网络相加后得到的新网络是一个可行流,那么下界网络一定是满流的(必须顶到原图的下界)。但是这样做了之后可能流量不守恒,因此我们需要对差网络进行一定的调整来使其平衡。(满流情况下)考虑下界网络的一个点 \(u\),如果他的流出量比流入量多 \(x\),那么就在差网络中新建一个汇点 \(t\),连一条 \(u\to t\),容量为 \(x\) 的边。这样在差网络流量平衡时,去掉 \(u \to t\) 额外的这条边后,\(u\) 的流入量刚好就比 \(u\) 的流出量多 \(x\) 了,因此相互抵消。对于流入大于流出的情况,就建立源点 \(s\),连边 \(s\to u\),容量为 \(x\) 就行了。在差网络上跑最大流,去掉附加边,加上下界网络就是一个可行流了。但是要注意如果附加边未流满,那么平衡条件就不会满足,也就无解了。在代码实现中,是不需要建立下界网络的,只需要对差网络进行操作即可。判无解可以只枚举 \(s\) 的出边,因为流量守恒,和 \(t\) 的出边一样。

有源汇有上下界可行流

从汇点向源点连一条容量限制为 \([0,\infin)\) 的边,问题转化为无源汇上下界可行流。此时从源点到汇点的可行流流量,即为从汇点到源点的那条附加边的流量(注意下界网络中对应边流量为 \(0\))。另外我们需要新建两个超级源汇点 \(s^{\prime},t^{\prime}\),因为现在题目中给了两个 \(s,t\) 了。

有源汇有上下界最大流

我们已经得到了一组可行流的,他的流量就是 \(t\to s\) 附加边的流量。那么此时我们只需要在差网络中把附加边删去,再在残量网络上跑最大流,加上可行流就是原网络的最大流了。为什么是对的?因为可行流已经保证了流量守恒,再加上一组流量守恒的流依旧守恒。并且在残量网络上跑最大流榨干他,就能保证答案也最大了。
LOJ模板 洛谷模板

最大权闭合子图

定义:若有向图 \(G\) 的子图 \(V\) 满足:\(V\) 中顶点的所有出边均指向 \(V\) 内部的点,则称 \(V\)\(G\) 的一个闭合子图。若 \(G\) 中有点权,则点权最大的闭合子图被称为 \(G\)最大权闭合子图
这个东西怎么求呢?建立网络流模型,对于点权 \(x \ge 0\) 的点 \(u\),连一条 \(s \to u\),容量为 \(x\) 的边;\(x <0\)\(u\) 连一条 \(u \to t\),容量为 \(-x\) 的边。对于原图中的边 \((u,v)\),在网络中连一条 \(u\to v\),容量为 \(\infin\) 的边。所有的正点权和 \(-\) 该网络的最小割就是最大权闭合子图的值了。为什么是这样?首先可以把网络划分成两个集合:一个是 \(S\),一个是 \(T\),其中 \(s \in S,t \in T,S \cap T = \varnothing\),这就是割的定义嘛,而 \(S\) 集合就是最大权闭合子图的集合,一开始为所有正数。对于原图中的边 \((u,v)\) 在网络中容量为 \(\infin\),一定不会被割,被割的只可能是和 \(s,t\) 连的边。假如我们割掉了一条 \(s \to u\) 的边,那么相当于把 \(u\) 划分进了 \(T\) 集合,代表最大权闭合子图不要 \(u\),因为 \(u\) 是正点权,相当于答案减少了 \(val_u\)。若割了 \(u\to t\),相当于把 \(u\) 划进 \(S\),因为 \(val_u<0\),因此答案要减少 \(-val_u\),刚好和最小割对应起来,证毕。
例题

最小路径覆盖

定义:给定有向图 \(G=(V,E)\) 。设 \(P\)\(G\) 的一个简单路(顶点不相交)的集合。如果 \(V\) 中每个定点恰好在 \(P\) 的一条路上,则称 \(P\)\(G\) 的一个路径覆盖。\(P\) 中路径可以从 \(V\) 的任何一个定点开始,长度也是任意的,特别地,可以为 \(0\)\(G\) 的最小路径覆盖是 \(G\) 所含路径条数最少的路径覆盖。
说人话就是在一个有向图中,选出最少的路径,使他们经过了所有点。考虑拆点:把一个点 \(u\) 分成左部点和右部点 \(u_l,u_r\),然后连边 \(s\to u_l\)\(u_r\to t\),容量都为 \(1\)。对于原图的边 \((u,v)\),连边 \(u_l \to v_r\)。这样答案就是总点数 \(-\) 最大流。为什么?因为一开始一共有 \(n\) 个点每个点覆盖自己,每次流一条边相当于合并两路径,这样路径数就 \(-1\),因此最大流就对应了最大合并数,答案就是 \(n-\) 最大合并数了。
例题

posted @ 2024-01-13 15:10  SunsetLake  阅读(23)  评论(1编辑  收藏  举报
-->