EK + Dinic 最大流算法理解
网络流常见问题 最大流:
我对残留网的理解:
- 原本网络中不存在流,为了求出最大流.人为的给出一条任意大小流从 源点出发经过一些边到达汇点.且流的大小最后被限制成 经过的边中 容量最小的边,但是流具有守恒性,不可能凭空产生???,所以又要从汇点流回去,所以形成了残留网
Ford-Fulkerson (方法)
Edmond-Karp (EK)算法理解
- 邻接表存储的小技巧: 2点之间的 来回边的下标
(x->y)
为i
,那么(x<-y)
为i^1
(成对变换) - 流程:
首先通过
bfs
从源点出发 找到任意一条 边的容量限制下可以到达汇点的路径 (称为增广路),且pre[]
记录一下.通过
pre[]
找到此次增广路径上 流的大小,,也就是路径上的容量最小的边,累加每次增广路径上的流的大小然后根据流守恒把 把图(网络) 更新为 新的图 (残留图).这样流才能守恒
直到
bfs
找不到增广路了就说明找到了最大流
1 |
|
Dinic算法由来: bfs
每次只能找到一条增广路效率太低
Dinic算法
背景:在一次增广的过程中想要找到 多条增广路
- 仍用邻接表存储
- Dinic算法 将 EK算法中的
bfs
找增广路 分为 2步.由bfs
分层.(源点到它最少要经过的边数).dfs
从源点开始由前一层向后一层反复寻找增广路.
流程:
bfs
通过图中的边 将 网络的图 分层- 在这次分层之后.重复调用
dfs
来找增广路.dfs(int i,int delta)
.i
表示当前点,delta
表示流入该点的流量int flow
:表示从该点已经流出的流量.min(delta - flow,edge[i].c)
:巧妙的解决了: 出边的容量 与 剩下可以流出的流量来满足增广路的需要.dfs
回溯时 维护 残留网dfs
中!flow
:流出的流量=0. 即 增广路找不到了.dep[u]==-1
.将该点从该层移出去(dfs
下次访问不到)
dfs
找不到增广路后.通过bfs
重新分层. 直到不能分层为止
总结: Dinic就是从每次找一条增广路 变为 在分层基础上由dfs去找多条增广路
1 |
|
SAP
算法理解 先占坑待解决参考北京大学暑期课讲义-网络流
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!