关于网络流的弧优化
绿色代表着该路径仍然具有残量,即这条边的容纳量没有被完全用尽,仍然允许有流的通过。
橘色代表该条边已经被耗尽。
假设在经过一次由源点到汇点的dfs后会呈现图中这样的情况。
在图中,我们可以观察到由A1指向B1的边、由B1指向C1的边和由B1指向C2的边被耗尽。
但对于B1来说如果不改变初始要遍历的边的顺序,依旧会对已经耗尽的边进行不必要的遍历,也就是说会浪费一定的时间。
而弧优化就是要去修改单点初始要遍历的边,从而避免了时间的浪费。
比如从B1开始的边就不再从连向C1开始,而是从连向C3开始。
关于弧优化的代码实现
在bfs中初始化
由于反向边的机制,有可能有一些边在跑dfs的过程中流量就重新恢复了,因而我们在起初的时候并不能很肯定去把起始边确定下来,所以对于每个结点的起始的cur数组还是要用h数组来进行一遍初始化。
cur[i]=h[i]
注意由于源点在跑bfs的过程中并没有被赋值到,所以要把源点单独拎出来进行赋值。
cur[S]=h[S]
在dfs中动态弧优化
每跑过一条边必然会使得该条边无法再继续传递下去。
这里的无法再继续传递下去分两种情况
一种是,当前所要研究的边的所有空间被利用完;
另一种情况是,当前所要研究的边仍然剩余一些空间,但这条要研究的边所连向的下一个的点的所有出边的流量都被利用完。