洛谷P3376 max flow template (Dinic's algorithm)
发布时间
阅读量:
阅读量
最大流dinic算法,模板题
EK算法在每次执行一次bfs操作时,仅能寻找到单一的一条增广路径。
dinic算法在每次调用bfs后,能够寻找到多条增广路径。
本题关键点:
1、dinic 算法的实现步骤
a) 通过bfs构建分层图,该图实质上构成一个增广网络
b) 在完成分层图构建后,利用dfs在该增广网络中进行搜索,并计算所有可能增广路径上的流量总和。
2、dinic 算法中的优化策略:当前弧优化:
now 数组用于记录每个节点即将访问的第一条边。
当通过bfs建立分层图时,某个节点 x 首次被加入队列时,now[x] 的值被设置为 head[x]。
在 dfs 过程中,会处理多条增广路径,这些路径可能在某一点(假设为x点)交汇。此时将多次调用 dfs(x, long long sum) 函数,在每次调用中从 now[x] 中选择第一条待处理的边进行操作。
假设 x 点有 y、z、w 三条边,并且其前驱节点是 fax。第一次进入 dfs(x, sum) 函数时处理了 y 边,剩余 z 和 w 边未被处理。然而由于从 fax 到 x 的边流量不足,无法继续处理 z 和 w 边。此时,在 for 循环内部将 now[x] = i; // 当前弧优化操作被执行,即将 x 点的下一条待处理边设置为 y 边。
for(int
全部评论 (0)
还没有任何评论哟~
