2172. Dinic/ISAP求最大流 - AcWing题库
给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量,边的容量非负。
图中可能存在重边和自环。求从点 S 到点 T 的最大流。
输入格式
第一行包含四个整数 n,m,S,T。
接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。
点的编号从 1 到 n。
输出格式
输出点 S 到点 T 的最大流。
如果从点 S 无法到达点 T 则输出 0。
数据范围
2≤n≤10000
1≤m≤100000
0≤c≤10000
S≠T
输入样例:
7 14 1 7
1 2 5
1 3 6
1 4 5
2 3 2
2 5 3
3 2 2
3 4 3
3 5 3
3 6 7
4 6 5
5 6 1
6 5 1
5 7 8
6 7 7
输出样例:
14
解析:
AcWing 2172. Dinic/ISAP求最大流(算法进阶课) - AcWing
Dinic算法:
1.创建一个residual graph,初始的residual graph的每条边的容量等于原图边的容量
2.循环:
a.构造level grahp(可以理解为层次遍历的图,保留层与层之间的边)
b.在level grahp寻找阻塞流
c.更新residual graph
时间复杂度 O(m*n^2):这说明Dinic算法通常比EK算法快
Dinic算法对优化特别敏感,所以一定要尽量使用优化。
1.这里最特别的优化是 cur 数组实现的当前弧优化,它表示这个弧之前的弧流量已满,所以之后的 弧从当前弧开始。
2.对于双向边的建立可以参考之前关于 EK 算法的讲解
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include