有上下界网络流建模方法

假设上界为 r r r, 下界为 l l l

无源汇可行流(循环流)

法一:

建立源点 s s s 和汇点 t t t , 对于图中每条边 &lt; u , v &gt; &lt;u, v&gt; <u,v> ,拆成如下三条:

  • $<s,v> $ ,容量为 l l l
  • $<u,t> $ ,容量为 l l l
  • &lt; u , v &gt; &lt;u, v&gt; <u,v> ,容量为 r − l r - l rl

其中前两条弧一般称为附加弧。

然后对图跑从 s s s t t t 的最大流,如果所有附加弧都满流,则有可行流。这时,每条非附加弧的流量加上它的容量下界,就是原图中这条弧应该有的流量。

法二:

建立源点 s s s 和汇点 t t t ,对于每条边建立 &lt; u , v &gt; &lt;u,v&gt; <u,v> 容量为 r − l r-l rl 的边。此外,对于图中每个点,令 $节点所有入流下界和节点所有出流下界和d[i] = \sum i节点所有入流下界和 - \sum i节点所有出流下界和 $ 。求 d d d 数组:若有一条 &lt; u , v , L , R &gt; &lt;u,v,L,R&gt; <u,v,L,R> 的边,令 d [ u ] − = L , d [ v ] + = L d[u] -= L, d[v] += L d[u]=L,d[v]+=L 即可。

d [ i ] &gt; 0 d[i] &gt; 0 d[i]>0, 建立 &lt; s , i &gt; &lt;s,i&gt; <s,i> 容量为 d [ i ] d[i] d[i] 的边。

d [ i ] &lt; 0 d[i] &lt; 0 d[i]<0 ,建立 &lt; i , t &gt; &lt;i,t&gt; <i,t> 容量为 − d [ i ] -d[i] d[i] 的边。

然后跑 s s s t t t 的最大流,若附加边全部满流,即 m a x f l o w = ∑ d [ i ] &gt; 0 maxflow = \sum d[i] &gt;0 maxflow=d[i]>0之和,存在可行流。每条边流量同法一。

有源汇可行流

从汇点 t t t 建立一条流向源点 s s s 的边,上界为 i n f inf inf 下界为 0 0 0 ,就转化成了无源汇可行流。然后按照无源汇的判定方法建图即可,需要建立一个超级源点 S S SS SS 和超级汇点 T T TT TT .求原图中每条边对应的实际流量的方法,同无源汇可行流,只是忽略掉弧 &lt; t , s &gt; &lt;t,s&gt; <t,s> 就好。而且这时候弧 &lt; t , s &gt; &lt;t,s&gt; <t,s> 的流量就是原图的总流量。

有源汇最大流

判断有解方法如上说述。而且一定要先判是否有解

如果存在可行流,那么在运行过有源汇可行流的图上(就是已经存在流量的那张图,流量不要清零),跑一遍从 s s s t t t 的最大流(这里的 s s s t t t 是原图的源和汇,不是附加超级源和附加超级汇),就是原图的最大流。

有源汇最小流

同上方法判断是否有解。求最小两种方法:

  1. 首先按照有源汇可行流的方法建模,但是不要建立 &lt; t , s &gt; &lt;t,s&gt; <t,s>这条弧

    然后在这个图上,跑从附加源 s s ss ss 到附加汇 t t tt tt 的最大流。

    这时候再添加弧 &lt; t , s &gt; &lt;t,s&gt; <t,s>,下界为 0 0 0,上界为 i n f inf inf

    在现在的这张图上,从 s s ss ss t t tt tt 的最大流,就是原图的最小流。

    理解方法:

    我们前面提到过,有源汇可行流的流量只是对应一组可行流,并不是最大或者最小流。

    并且在跑完有源汇可行流之后,弧 &lt; t , s &gt; &lt;t,s&gt; <t,s>的流量就是原图的流量。

    从这个角度入手,我们想让弧 &lt; t , s &gt; &lt;t,s&gt; <t,s>的流量尽量小,就要尽量多的消耗掉那些“本来不需要经过 &lt; t , s &gt; &lt;t,s&gt; <t,s>”的流量。

    于是我们在添加 &lt; t , s &gt; &lt;t,s&gt; <t,s>之前,跑一遍从 s s ss ss t t tt tt 的最大流,就能尽量多的消耗那些流量了。

  2. 把最小流的初始值设为 T T T S S S 这条边的流量,把 S S SS SS 连出去的边清掉,把 T T T S S S 的边删掉,再在残量网络上跑一次 T T T S S S 的最大流,初始最小流减去这次的最大流就是答案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值