特殊网络流与部分网络流好题
在博客园的第一篇文章啊,这里主要存放一些对于本蒟蒻来说有深度的算法解释和题解。
Part 1 特殊的网络流
无源汇上下界可行流
首先,网络流一定要流量守恒,无源汇的网络流没有源点和汇点,不可能随便变出来流量给你流,所以无源汇网络流一定是个环,这是从定义上可以理解的。
然后,对于每一条边edgei,我们有一个上界\(u_i\)和一个下界\(d_i\),那么\(u_i-d_i\)这部分就是自由流了。我们在网络中建立这条边,流量设定为自由流量ui-di。对于一个顶点u,我们定义\(c_u=\sum_{edge_i∈in_u}{d_i}-\sum_{edge_j∈out_u}{d_j}\)。接下来我们只看下界。于是,如果\(c_u<0\),流出大于流入,因为流量守恒我们需要从超级源点连一条边到u,流量为\(|c_u|\),否则我们从这个点向超级汇点连\(c[u]\)的边。
最后,我们从超级源点到超级汇点跑一边网络最大流,如果每条超级源点或者超级汇点的边都流满了,那么说明这个图的网络流量是守恒的,存在可行流,反之不可行。
有源汇上下界最大流
碰到上下界咱就不好解决了,尝试先变成无源汇上下界可行流,把下界都满足了之后去残量网络上去跑自由流量。
首先要变成无源汇的,非常粗暴,我们直接从汇点到源点连一条无穷边,就把整个图放进了环中。需要注意的是,统计c数组的时候是不用统计这条无穷边的(不然怎么算啊)。
然后按照无源汇上下界可行流那样建图,从超级源到超级汇跑一次网络最大流,判断是否可行,如果不可行的话那上下界都满足不了显然就不可能有最大流。
最后去掉与超级源超级汇连接的所有边,在残量网络用原来的源点和汇点跑一边网络最大流,在已经满足上下界的前提下去满足流量尽量地大,这次网络最大流的答案就是整个图的网络最大流。
其实还有一种解法,就是判断完可行流之后不仅删除上述的边还删除那条无穷边,这样答案是本次最大流+原来可行流。
请读者想一想为什么,实际上以我个人理解那条无穷边中流过的流量,就是可行流的大小。
有源汇上下界最小流
部分读者认为可行流其实就是最小流,其实不是。
首先按照有源汇上下界最大流那样跑可行流,然后删除那条无穷边,从T到S跑网络最大流,把多流的边压回去。
答案就是可行流-本次最大流。
如果读者理解有源汇上下界网络流的话那这个也很容易理解了。
上下界费用流什么的与这个本质相同,不再赘述。
Part 2 推荐一些网络流好题
AGC31E Snuke the Phantom Thief
AGC31E Snuke the Phantom Thief
这道题建图是真的妙啊。
我们先放在一维世界看一看。不如把所有点排一下序。于是乎,如果要求小于w的小于等于i个,不如说保证a[i+1]>=w。但是,如果要求大于w的小于等于i个,我们就需要一个选取的点总数了。怎么办?枚举!我们从1到n依次枚举s为选取的点的总数。然后就变成了a[n-s-1]<=w。显然对于每个点所在的区间[l,r],是单调不降的,可以继承下来。对于每个点就有了自己必须要放的区间,匹配即可。
放到二位世界了呢?不如把点分为三层,第一层横坐标,第二层是点,第三层纵坐标,跑最大费用最大流即可。

浙公网安备 33010602011771号