【学习笔记】【模板】【自学】网络最大流

定义:

$f(x,y)$ 表示连接 $x$ 和 $y$ 的流量,$c(x,y)$ 表示连接 $x$ 和 $y$ 的最大流量限制。

显然有 $f(x,y)\le c(x,y)$,也有 $f(x,y)=-f(y,x)$,因为逆流流量相反。

剩余流量:$c(u_{i},u_{i+1})-f(u_i,u_{i+1})$

增广路:设该路径为 $u_1,u_2,....,u_k$ 为一条增广路,$u_1=s,u_k=t$,$i\in[1,k)$,则有 $f(u_i,u_{i+1})< c(u_i,u_{i+1})$,即
$$c(u_{i},u_{i+1})-f(u_{i},u_{i+1})>0$$


$\text{Q}$:思考,为什么不是 $f(u_i,u_{i+1})\le c(u_i,u_{i+1})$,这样明明也满足流量限制,后面解释。

$\text{Edmonds - Karp}$ 增广路算法(简称 $\text{EK}$ 算法)

最优路径一定沿着 $s$ 到 $t$ 的增广路之一的,在寻找增广路时,$\text{BFS}$ 时只考虑剩余流量大于 $0$ 的,这也是增广路的定义,在寻找时,找到一个增广路,考虑增广路每一条边剩余流量的最小值,就能集体加上这个最小值,即将所有的剩余流量都减去这个最小值,这个最小值是
$$\min(c(u_1,u_2)-f(u_1,u_2),...,c(u_{t-1},u_t)-f(u_{t-1},u_t))$$

加入这个最小值,这也是这条增广路所有边所能加上的最大的流量。

$\text{A}$:在这里,也就说明了 $c(u_i,u_{i+1})-f(u_i,u_{i+1})\not=0$,因为如果将这条边加入增广路之后,整个能增加的剩余流量最小值只能为 $0$,因为这并没有意义,所以增广路的定义是 $c(u_{i},u_{i+1})-f(u_{i},u_{i+1})>0$。

反向边 $(\text{EK}$ 算法重点$)$

反悔的机会,每次 $\text{update}$ 时将反向边的剩余流量加上这个最小值,就是将原来的那条边重置,再次 $\text{BFS}$ 求增广路时可以二次遍历这条边(尽管这是反向边,但是边权依然和正向边相等)。

$\text{Tips:}$ 链式前向星存正反向边记得成对存储,用 $\text{xor 1}$ 十分方便。

时间复杂度:$\text{O(}nm^2)$。

posted @ 2023-09-10 17:52  CSP_AK_zyz  阅读(56)  评论(0)    收藏  举报