网络流算是很早之前学过的知识点了 当时只是简单学习了一下上下界网络流的内容 现在来深剖本质了.
首先 网络流 在一个网络之中有流的存在 且是流量守恒的。
上下界网络流则是 网络中的每一条边都有上下界 流经这条边的流量必须满足这个上下界。
1. 无源汇上下界网络流。
无源无汇 说明图中存在一股流循环往复的流 这种流叫做循环流且满足我们的上下界。
显然如果存在合法的循环流 那么每条边的流量一定是大于下界的。
于是乎我们先让所有的下界流都先流过 此时发现了流量是不守恒的,体现在每个点的进入流量和流出流量上面。
所以我们进一步得到了 一张网络图上是循环流的条件:所有的点满足流入量=流出量。
接下来是调整流了 我们把残余网络建出来 由于只需要用加流不需要再退流 此时网络上每条边只有上界流量了。
考虑把我们的附加流求出来+初始的下界流即可得到循环流。
考虑初始的某个点x 如果初始的时候流入量>流出量 那么附加流的时候应该满足流入量<流出量。
数值还应该相等才对,我们想要再流出这么多流显然我们应该有这么多流才行 虚建源点加上这么多流让其跑流即可。
至于相反的情况是 流入量>流出量 我们流入显然是其他点要给我们流入我们只需要把流出的这么多流走即可 和虚建汇点相连接流即可.
显然我们求出了最大流 就是一组合法的解。显然正确,但是采用这种方法构造值得揣摩把dinic用的活灵活现的...e
2. 有源汇上下界可行流。
可行流需要满足 每条边的下界 好像很难解决这个问题。
我们认真分析一下这个流 发现源点的流出量等于汇点的流入量。
源汇点相连 所有点都需要满足流量守恒且是无源汇的且是一个可行流 且有上下界。
套用上一道题的做法即可.
3. 有源汇上下界最大流。
我们发现在求出可行流之后并非是最大的。
此时可行流已经是合法的了 我们只需要再扩充流即可.
显见再从S跑到T扩流即可.
先证明合法性:由于我们跑可行流后我们假设已经把边上的一些流放到原图中,接下来跑最大流显然的是超级源汇点的所有边都满流了所以不可能退流,所以说既然不可能退流说明每一条边一定满足上下界此时再跑最大流扩流是正确的。
4. 有源汇上下界最小流.
先求出有源汇的可行流考虑调整 显然我们要减少流 由t到s跑最大流是退流的过程同时也是减少流的过程.
那么答案=可行流流量-(t-s)的最大流.
考虑合法性:显然我们也完不成由TT到SS的退流,因为他们的边都满流了 所以是合法的。
考虑正确性,为什么我们还能调整 因为可以用更少的流来满足下界,之前只是一个满足上下界的随便的一个流,但是最小流是指用最少的流来满足所有边的下界.
所以我们反过来退流在不影响正确性的情况下能退多少退多少,所以是正确的。
这里给出一个细节注意:跑完可行流图中真正的流量是 T到S反向边的流量,而并非是此时图中的最大流。
二者是有区别的而不能混为一谈 因为最大流只是保证了下界合法 和图中的可行流没有关系,这点不要混淆。