最大流加强版,从 ID 算法到 LCT
EnofTaiPeople · · 题解
Part1-Improved Dinic
ID(Improved Dinic) 算法是一种求最大流的高效算法,在随机图上复杂度为
ID 算法原理就是,对 Dinic 算法进行很多优化,最后不仅代码较短,效率也很高,值得一提的是,即使是小规模数据,他也能跑得比一般算法快。
具体优化如下:
- 当前弧(允许弧)优化;
- 分段加边优化;
- 先正后反(贪心初始流)优化;
- gap 优化。
当前弧(允许弧)优化大家都懂,分段加边优化是为了防止边权差异过大,因为 Dinic 算法只有在边权差异大时会跑得较慢。
贪心初始流是采用了二分图增广路算法的贪心初始匹配思想,先不连反边是为了不然反边影响初始效率,gap 优化可以参照 ISAP,AC 记录。
Part2-LCT-Dinic
这是一个最坏复杂度为
把 ID 卡慢很简单,
我们需要对 Dinic 的增广过程进行研究,考虑其之所以单次增广最坏为
发现一条边在一条增广路上如果没有满流,就还会继续扫到,这样对效率的影响极大,于是可以用数据结构来维护连边,断(零)边,链减(得到的流量),使用可爱的 LCT 十分合适,于是就这样愉快地决定啦!
由于单次增广每一条边最多只会加入一次,减少一次,每一次加入减少的复杂度都是平摊
加上 ID 的优化三(贪心初始流)就可以通过 luogu 数据了,并且速度比 ID 快一倍。
但是,在 UOJ 上会 TLE。
Part3-总结
其实 HLPP 的优势局限于本题的数据范围,再稠密点常数没有 MPM 小,再稀疏点就不如 LCT-Dinic。
以上 ID 的代码能通过 Luogu、LOJ、UOJ 的数据,但 LCT-Dinic 即使分段连边也通不过 UOJ 的第三十个测试点,而该点 ID 却能在
事实上,我还没见过有人在建模题上卡 Dinic,这就当整活图一乐了。