浅谈网络流Dinic算法

浅谈网络流Dinic算法

本篇随笔简单讲解一下网络流中的Dinic算法。


一、前置知识

浅谈网络最大流

一些基本定义

1、弧:网络上的有向边被称作弧。弧分为前向弧和后向弧。前向弧就是题目中给出的有向边,后向弧就是我们所建立的反边。

这样地、弧就有了容量、流量、零流弧、饱和弧这些建立在网络流边上的定义。

2、链:网络的一条顶点序列被称作链。注意,只要是相连的顶点序列就可以,不一定要求弧的方向相同。所以一条链中既有前向弧,又有后向弧。


二、Dinic算法的原理

其大致步骤大致为:

在网络上通过\(BFS\)为其划分层次。层次在我理解中,是和深度差不多的概念。但是深度只在树上划分,而层次就是图上的。我们可以理性地将其理解为从源点到此处的最短路。

但是这个层次划分是有条件的,我们要求所有的点必须可达,也就是从源点到它的链上不能有零流弧。

然后再用DFS寻找。

这个算法的时间复杂度最坏是\(O(n^2m)\)。

其时空复杂度的优化主要是因为这个“分层”。分层操作预处理出所有点到源点的距离,所以我们增广的时候,只向层数高的地方增广,可以保证不走回头路,不绕圈,这样就排除了很多冗余搜索,大大提升时空复杂度。


三、Dinic算法的优化

Dinic算法的优化方式有两种,第一种是多路增广,第二种是当前弧优化。

理论复杂度是\(O\)(可过)——LLQ

多路增广

我们可以使用多路增广节省很多花在重复路线上的时间:在某点DFS找到一条增广路后,如果还剩下多余的流量未用,继续在该点DFS尝试找到更多增广路。

当前弧优化

在Dinic算法中,一条边增广一次后就不会再次增广了,所以下次增广时不需要再考虑这条边。我们把head数组复制一份,但不断更新增广的起点。


四、Dinic算法的代码实现

上一篇:Dinic算法详解及实现


下一篇:网络流 dinic算法