Dinic算法是最大流算法中比较常用的,效率也很高。
普通的Dinic,在原来的求增广路线的基础上添加了一个bfs(),用来分层,分层可以使用一个数组标记节点所在的层数,搜索增广路线时,严格按照节点层数递增的顺序搜索,这样可使得dfs()的深度最低,从而节省时间。
当前弧优化:例如 中间节点A,有三个流向,A->B, A->C,A->D,在A点时, 如果A->B,A->C这两个边都已经满流,那么下次再经过A节点时,直接跳过A->B,A->C这两条边,直接访问A->C这个点,这个就是当前弧优化,实现方式,可开一个数组记录每个节点访问到第几条边(这个好像优化的效果不是很明显)。
多路增广:到达每一个节点,都尽可能的增广,直到增广到汇点。
爆点:一次分层,多次寻找增广路线,在一次寻找增广路线中,发现, 中间节点A,有三个流向,A->B, A->C,A->D,这个三个流向都满流了,那么这个节点就不能作为中间节点出现了,因为它的流向都已经作为增广路线,全部占满了。具体操作,存储层数的数据把这个节点的层数标记为负数。
刚学习最大流算法,代码还没有具体实现,先记录学习的成果。