有上下界的网络流
给定一个网络,一个加权的有向图G,其中的每条边都有一个容量上界C。其中的两点:S只有出度没有入度,T只有入度没有出度。求S到T最大可以流过的流量,这是最大流的模型。
且满足以下条件:
- 容量限制:每条边的流量0≤f≤C0≤f≤C0≤f≤C
- 流量平衡:任意一个点iii,∑(u,i)∈Ef(u,i)=∑(i,v)∈Ef(i,v)\sum_{(u,i)\in E}f(u,i)=\sum_{(i,v)\in E}f(i,v)∑(u,i)∈Ef(u,i)=∑(i,v)∈Ef(i,v)(除了S,T节点)
这就是一个有源点和汇点的网络流模型
如果将条件1改为B≤f≤CB\leq f \leq CB≤f≤C那么该模型就变成了有上下界的网络流模型
如果再将条件2中的除了S,T节点去掉,那么该模型就变为无源汇上下界网络流
现在我们考虑如何判断无源汇网络流的可行流。
我们会求网络流的最大流,也会判断网络流是否有可行流,所以我们的思路是如何把无源汇上下界网络流变成网络流?也就是把那个下届去掉。
看下面这个图
上面那副图是一个无源汇上下界网络流,我们现在把他的下届单独拿出来,形成一个新的边,(C为上界,B为下界)如下图红边所示,然后把原来的边变为C′=C−BC' =C-BC′=C−B。假设有一个可行流(这个可行流是循环的),那么真正的可行流在每条边上的值一定≥\geq≥(定义),也就是说每个红边加上原来的黑边的某一个值才是真正的可行流流过这个边的值(这句话可能太长…本人语文表达并不好)。现在我们令红边是B(u,i)B(u,i)B(u,i),显然,
∑u∈VB(u,i)≠∑v∈VB(i,v)\sum_{u\in V}B(u,i) \neq \sum_{v \in V}B(i,v)u∈V∑B(u,i)̸=v∈V∑B(i,v)
也就如果用每个边的下界来当作流的话显然不满足流量守恒
但是可行流的流量≥\geq≥B,所以我们此时需要从那个黑边中寻找一些流,让他与红边不满足流量守恒的流量在每个对应位置相加,就可以得到满足上下界的可行流。
如何求黑边中的流呢?我们只会求有源点和汇点的最大流,并且流量守恒,黑边中寻找到的流也不满足流量守恒(因为他需要和红边相加才能满足流量守恒,红边不满足了,它肯定也不满足),并且这些流还是循环流。我们需要把他转变成网络流问题。
现在我们给黑边起个名字叫附加流,记作g(u,v)g(u,v)g(u,v),我们需要把黑边中找到的流和红边的流相加满足流量守恒也就是
∑u∈V[B(u,i)+g(u,i)]=∑v∈V[B(i,v)+g(i,v)]\sum_{u\in V}[B(u,i) +g(u,i)] = \sum_{v \in V}[B(i,v)+g(i,v)]u∈V∑[B(u,i)+g(u,i)]=v∈V∑[B(i,v)+g(i,v)]
移项
∑u∈VB(u,i)−∑v∈VB(i,v)=∑v∈Vg(i,v)−∑u∈Vg(u,i)\sum_{u\in V}B(u,i) - \sum_{v \in V}B(i,v)= \sum_{v \in V} g(i,v) - \sum_{u \in V}g(u,i)u∈V∑B(u,i)−v∈V∑B(i,v)=v∈V∑g(i,v)−u∈V∑g(u,i)
我们令∑u∈VB(u,i)−∑v∈VB(i,v)=M(i)\sum_{u\in V}B(u,i) - \sum_{v \in V}B(i,v)=M(i)u∈V∑B(u,i)−v∈V∑B(i,v)=M(i)
若M(i)≥0M(i) \geq0M(i)≥0(M(i)M(i)M(i)为已知量),那么∑v∈Vg(i,v)−∑u∈Vg(u,i)≥0\sum_{v \in V} g(i,v) - \sum_{u \in V}g(u,i) \geq0v∈V∑g(i,v)−u∈V∑g(u,i)≥0
说明对于iii节点,流出的附加流应该大于流进的附加流,且大于多少呢?大于M(i)M(i)M(i),也就是说节点iii两边的附加流只有严格满足这个条件的时候才能满足流量守恒,我们现在创建一个源点SSSSSS,让SSSSSS流入iii节点M(i)M(i)M(i)流量。
若M(i)≤0M(i) \leq 0M(i)≤0,也就是
∑v∈Vg(i,v)−∑u∈Vg(u,i)≤0\sum_{v \in V} g(i,v) - \sum_{u \in V}g(u,i) \leq0v∈V∑g(i,v)−u∈V∑g(u,i)≤0
说明对于iii节点,流入的附加流应该大于流出的附加流,
创建一个节点TTTTTT,让iii节点流出M(i)M(i)M(i)流量到TTTTTT节点。
对所有的节点都重复以上操作
我们现在不去管那些g(u,i)g(u,i)g(u,i),而只关注M(i)M(i)M(i),我们只需要从SSSSSS流出到和流入到TTTTTT的那些流,这些流混杂在附加流中,附加流如果去掉每个附加流中包含的M(i)M(i)M(i),肯定满足流量守恒(这是最难理解的),如果iii节点流入的附加流大于流出的附加流,并且大M(i)M(i)M(i),那么流入的附加流去掉M(i)M(i)M(i)后,肯定满足流量守恒啊,反之流出大于流入也是如此,那么这些阻碍附加流满足流量守恒的M(i)M(i)M(i),如果我们看看他们在无源汇上下界网络流中是否能够流动起来不就得了吗?想想最大网络流正好是干这个事情的。
正好SSSSSS和图中每个节点的链接就是这些捣乱的M(i)M(i)M(i),TTTTTT也是,所以我们只需要从SSSSSS到TTTTTT求一个最大网络流就可以了。
明天继续有上下界的’最大’网络流