网络流在入门ing

网络流入门

推荐这个视频,之前生看书的话,知识储备存在断层,而这个UP则详细讲述了网络流的产生过程,没想到和线性规划还这么密切。

有空补档,方便自己回忆吧,建议完整看下视频。

----

主要是记录下自己看到的和理解吧,后面随着做题还会更正的。如有不严谨的地方还望大佬指正,谢谢!

首先介绍几个定义:

1.割:OI-WIKI的定义

绿导师的定义:

2.从s到t的不相交的路径:指从s到t的两条路径没有公共边

为了求从s->t的不相交路径,我们先考虑这样一个问题。

假设点集S包含了除了t以外其它所有点,点集T仅包含点t,那么此时从s->t的不相交路径数目的上界S-T的割数。

再极端到点集S仅包含s,T包含除了s以外所有点,那么s->t的不相交路径数目的上界也是此时S-T的割数。

所以s->t不相交路径数目的上界是所有S-T割的最小值。

下面再来看一下怎么求不相交路径的数目--Ford-Fulkerson方法。

对于这个图,我们找0->5的不相交路径数。显然,人可以很快看到两条[0-1-4-5]和[0-3-2-5].但是当DFS的时候有可能会出现[0-3-4-5]然后就只有一条了。面对这种情况该怎么办呢?

我们比较下两种情况选择走过的边,有没走的,有多走的。

我们可以发现,这种不正确的路径寻找以外,如果把它多走的这一条边反向的话,可以多产生[0-1-4-3-2-5]这一种走法。

对于s->t已经找到了这些路径,我们在下一次寻找的时候将路径反向,然后如果此时发现有某条路径是经过其中某个反向边的,那么我们可以对原来的路径进行改变,然后似乎就达成了一种后悔贪心的作用。

然后对于带权图,我们就把权重看作重边。

关于增广路径

残留网络:“用以纠正错误的新图,就是大家在各种网络资料上看到的残留网络”

在第三版的算法导论中,“之所以称其为‘方法’而不是‘算法’,是因为它包含了几种运行时间各不相同的具体实现。”所以我们通常使用的算法名称并不叫这个。

可以理解为流入“使用了f(u,v)条u->v的重边,总共有cuv条重边”。

接下来是和线性规划的关系。

我们为每个路径设置一个变量x1,x2,x3......表示过该路径的值(我理解是走了几次或者是走了几个重边)

要求max(x1+x2.....)

它满足下面的条件

过某一边的x1+x2+x3....<=c

//有多少边,就有多少个约数条件,有多少路径,就有多少x

这是一个求最大流的线性规划问题,它的对偶问题就是求最小割,emmm,这下最大流=最小割了。

最大流最小割定理:任何一个网络的最大流量等于最小割中边的容量之和。

求解算法:

Edmonds-Karp增广路算法:O(nm3) 处理1e3-1e4规模的网络

Dinic算法:O(m sqrt(n)) 处理1e4-1e5规模的网络

 

费用流:G=(V,E),每条边除了有容量限制c(x,y)以外,还有一个给定的“单位费用”w(x,y).花费是f(x,y)*w(x,y).分为”最小费用最大流“和“最大费用最大流”,合称费用流。

求解算法:

在Edmonds-Karp增广路算法的基础上改成每次用SPFA求一条单位费用之和最小的增广路。

posted @ 2023-08-12 10:15  qbning  阅读(12)  评论(0编辑  收藏  举报
描述