网络流——最大流增广路算法

网络流——最大流增广路算法


最大流问题

最大流问题是给定源点 s 和汇点 t ,在允许从其他点中转的情况下,询问最多有多少个物品能从源点 s 运送到汇点 t 。


增广路算法

首先提出残量这个概念,残量指的是对应边上容量与流量之差,通俗来说就是这条边再允许通过的最大物品个数

增广路的思想就是找到一条由起点到汇点的路径(这个路径就是增广路),去除这条路径上残量的最大值 delta,为路径上的所有边的流量加上 delta。通俗来说就是有 delta 个物品通过这条路由源点运送到了汇点,而选择运送 delta 件物品的原因显而易见。

思考下面这种情况

反向边案例

如果我们第一次找 1 - 2 - 3 这条增广路, 通过这条路径我们运送了 1 件物品。如果通过这个增广路运送物品,则我们能够得到的最大值是1。然而答案应是 2 ,方法则是分别通过 1 - 2 - 4 和 1 - 3 - 4 这两条路径。

增广路的思想正确性是显而易见的,但是相对于这个图来说,我们缺少的是一个撤销的操作。如果举出增广路的同时回溯,那复杂度将会上升到指数级别,复杂度无法接受,因此引入了一个反向边的概念。

一条边的反向边就是从它的终点指向它的起点的边,这些反向边同样也具有流量,但是这些流量初始是0反向边是相对的。

如果加上了反向边,那么图一就会变成如下情况

反向边

在图二的情况下,我们同样先从 1 - 2 - 3 - 4 的这条增广路开始,在将增广路上所有边的残量减一的同时,也要对每条边的反向边加一

就构成了下图这种情况
反向边

这时我们发现 1 - 3 - 2 - 4这条增广路又联通了。注意在走这条增广路的同时也要对对应的反向边操作

添加反向边的原因是什么呢。其实如果我们走 3 - 2 这条反向边,就会为其对应的 2 - 3 这条刚开始走的边恢复到了 1 ,相当于不经过 2 - 3 这条路径。

这就是增广路算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值