算法设计学习笔记(七)——网络流

网络流


目录

网络流

一、最大流问题与Ford-Fulkerson算法

二、网络中的最大流与最小割

三、选择好的增广路径

四、前向流推动最大流算法

五、第一个应用:二分匹配问题

六、在有向与无向图中的不交路径

 七、对最大流问题的推广

 八、调查设计

九、航线调度

 十、图像分割

十一、项目选择

十二、棒球排除

十三、进一步的方向:对匹配问题增加费用


二分匹配——网络流的特例

一般性的问题——最大流问题

一、最大流问题与Ford-Fulkerson算法

1.问题

交通网络。

要素:边的容量,源点,汇点(终点)

流网络:

是具有以下特征的有向图G=(V,E)

  • 每条边e管理一个容量
  • 存在单一源点
  • 存在单一汇点

定义流:

一个流f必须满足以下两个性质:

  1. (容量条件)对每个e\in E,我们有 0\leq f(e)\leq c_{e}.
  2. (守恒条件)除了s与t之外,对每个结点v,我们有进入结点v的所有边上的总流值等于离开结点v的所有边上的总流值

最大流问题:
给定一个流网络,找出一个具有最大值的流。

(将证明最大流值等于称之为最小割的任何这种划分的最小容量)

2.设计算法

剩余图:

我们如下定义G关于f的剩余图 G_{f} :

  • G_{f}的结点集与G的结点集相同
  • G的每条边e=(u,v),其中 f(e)< c_{e} ,那么存在 c_{e}-f(e) 的剩余的容量单位,在这个容量上向前推进,得到一条边 e=(u,v) \in G_{f} ,容量为c_{e}-f(e),我们把这种形式的边叫做前向边
  • G的每条边e=(u,v),其中 f(e) > 0 ,那么在上面还存在 f(e) 单位的流,我们只要想做,就可以通过向后推这个流来“撤销”它,因此我们在G_{f}中的到一条边{e}'=(u,v),其中容量为f(e)。我们把这种形式的边叫做后向边

在剩余图中的增广路径:

augment(f,P)

令 b=bottleneck(P,f)

For 每条边(u,v)\in P

        If e=(u,v)是一条前向边 then

                在G中把f(e)增加b

        Else ((u,v)是一条后向边,且令e=(u,v))

                在G中把f(e)减少b

        Endif

Endfor

Return f

为反映增广的重要性,人民常把在剩余图中的任何一条 s-t 路径认为是一条增广路径。

命题7.1 {f}'G中的一个流。

计算G中一个 s-t 流的算法:

Max-Flow

对G中所有的e初始化 f(e)=0

While 在增广图 G_{f} 中存在一条 s-t 路径

        令 P 是 G_{f} 中的一条简单路径

        {f}' = augment(f,P)

        把 {f} 更新为 {f}'

        把增广图 G_{f} 更新为G_{​{f}'}

Endwhile

Return {f}

3.分析算法:终止与运行时间 

命题7.2 在Ford-Fulkerson算法的每个中间步,流值\{​{f(e)}\}G_{f}中的剩余容量是整数。

命题7.3 令 {f} 是G中的流,且令P是G_{f}中的一条简单的s-t路径.那么,v({f}') = v(f)+bottleneck(P,f),并且由于bottleneck(P,f)> 0,我们有v({f}') > v(f).

定理7.4 假设在流网络G中的所有容量都是整数,那么Ford-Fulkerson算法在至多C次While循环的迭代后终止。

定理7.5 假设在流网络G中的所有容量都是整数,那么Ford-Fulkerson算法的运行可以在O(mC)时间内实现。

二、网络中的最大流与最小割

1.分析算法:流与割

割:s-t割是结点集合V的一个划分(A,B),使得s\in A,t\in B

定理7.6{f}是任何s-t流,且(A,B) 是任意s-t割,那么 v(f) = f^{out}(A)-f^{in}(A).

命题7.7{f}是任何s-t流,且(A,B) 是任意s-t割,那么 v(f) = f^{in}(B)-f^{out}(B).

定理7.8 令{f}是任何s-t流,且(A,B) 是任意s-t割,那么 v(f) \leq c(A,B).

2.分析算法:最大流等于最小割 

 定理7.9 如果{f}是使得在剩余图G_{f}中没有s-t路径的一个s-t流,那么在G中存在一个s-t(A^*,B^*)使得v(f) = (A^*,B^*),因此,{f}有G中任何流的最大值,且(A^*,B^*)有G中任何s-t割的最小容量。

定理7.10 有Ford-Fulkerson算法返回的流\bar{f}是最大流

定理7.11 给定一个最大值的流,我们可以在O(m)时间内计算一个最小容量的s-t

命题7.12 在每个流网络中,存在一个流{f}和一个割(A,B)使得v(f) = (A,B)

定理7.13 在每个流网络中,一个s-t流的最大值等于一个s-t割的最小容量

3.进一步分析:整数值的流

定理7.14 如果在流网络中所有的容量都是整数,那么存在一个最大流{f},它的每个流值f(e)都是整数。

三、选择好的增广路径

 1.设计一个更快的流算法

缩放参数\Delta

Scaling Max-Flow

对G中所有的e初始化f(e) = 0

初始化置 \Delta 是2的最大的幂,且不大于从s出来的最大容量:\Delta \leq max_{e\ out\ of\ s }\ c_{e}

While \Delta \geq 1

        While 图 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值