【DayDayUp】【算法_图_网络流_之一_增广路】

来源:互联网 发布:鲁滨逊漂流记游戏java 编辑:程序博客网 时间:2024/05/20 19:15

【坚持不能偷懒】

(概念简单说明,具体还请自行百度……)

网络流:

常见问题:最大流

一个图,有向图,边上有容量上限,许多点,起点S,终点E

从S到E,最多流量是多少


核心思想:

【增广路】【剩余图】【反向边】

朴素地说

我找完一条路了,把流量去掉

则加入【反向边】重新做图

做出的图就是【剩余图】


如果我还能找到一条流量不为0的路径

即是一条【增广路】

这条【增广路】的加入,使得流量更多

当无法找到【增广路】时,则为最优


什么是【反向边】

就是譬如我一条边是 A -> B

它能容纳 10 的流量

我已经在当前情况下,占用了8的流量

那么,我的某种更好的情况,或许需要让8变成76543210 或者 910

变成9 10比较容易,就是在剩余图中 A->B 10 改成 A->B 2

而如何【反悔】呢? 就是 B->A 原本没有(0) 改成 B->A 8



譬如

A -> B 10]B -> C 5]B -> D 5] C -> P 10]D -> P 10

那么我第一步,搜到一条 A,B,C,P 的 5 的流量

则图被更改为

A -> B 5]B -> C 0]B -> D 5] C -> P 5]D -> P 10

同时更新反向边

B -> A 5] C -> B 5]P -> C 5]


那么,解题过程就是


while 找到增广路 == true

更新图()


这个复杂度是多少呢(点为V,边为E)

每次找增广路,实际上是要搜尽的,也就是每条边来一次,E

网上说:“可以证明” 增广路的搜索次数不会超过 V * E

所以复杂度就是 O(V E^2) 还是很炸的 完全图最坏就是 V^5了

于是我们就要优化……




——瞎扯时间——

这个最多增广次数 V E 是咋个来的呢……

现在开始瞎扯,看能不能扯出来

思路一:

每次找到增广路,都会使得流量变大

如果一开始最小 是 某个 E(min)

最后最大的流量 是 ∑E(某些)

我的流量更新梯度是 E(min) 点点点 到 E(一坨)

这个上限是我源点S 和 汇点T 周围的流量和的最小值

就算都连上 也就是 V 个 单边的流量

好吧,扯不出来

思路二:

——瞎扯失败——


这个Blog上有对网络流的很专业很全面的讲解,感觉自己写的真是好low……

http://blog.csdn.net/fengchaokobe/article/details/7584781











0 0