根据残量网络计算层次图。
在层次图中使用DFS进行增广直到不存在增广路
重复以上步骤直到无法增广
小贴士:一般情况下在Dinic算法中,我们只记录某一边的剩余流量.残量网络:包含反向弧的有向图,Dinic要循环的,每次修改过的图都是残量网络,层次图:分层图,以[从原点到某点的最短距离]分层的图,距离相等的为一层,(比如上图的分层为{1},{2,4},{3})DFS:这个就不用说了吧…增广 :在现有流量基础上发现新的路径,扩大发现的最大流量(注意:增加量不一定是这条路径的流量,而是新的流量与上次流量之差)增广路:在现有流量基础上发现的新路径.(快来找茬,和上一条有何不同?)剩余流量:当一条边被增广之后(即它是增广路的一部分,或者说增广路通过这条边),这条边还能通过的流量.反向弧:我们在Dinic算法中,对于一条有向边,我们需要建立另一条反向边(弧),当正向(输入数据)边剩余流量减少I时,反向弧剩余流量增加I
较详细解释(流程) :用BFS建立分层图 注意:分层图是以当前图为基础建立的,所以要重复建立分层图用DFS的方法寻找一条由源点到汇点的路径,获得这条路径的流量I 根据这条路径修改整个图,将所经之处正向边流量减少I,反向边流量增加I,注意I是非负数重复步骤2,直到DFS找不到新的路径时,重复步骤1
对于反向弧(反向边)的理解:这一段不理解也不是不可以,对于会写算法没什么帮助,如果你着急,直接无视即可.先举一个例子(如右图):必须使用反向弧的流网络在这幅图中我们首先要增广1->2->4->6,这时可以获得一个容量为2的流,但是如果不建立4->2反向弧的话,则无法进一步增广,最终答案为2,显然是不对的,然而如果建立了反向弧4->2,则第二次能进行1->3->4->2->5->6的增广,最大流为3.Comzyh对反向弧的理解可以说是”偷梁换柱“,请仔细阅读:在上面的例子中,我们可以看出,最终结果是1->2->5->6和1->2->4->6和1->3->4->6.当增广完1->2->4->5(代号A)后,在增广1->3->4->2->5->6(代号B),相当于将经过节点2的A流从中截流1(总共是2)走2->5>6,而不走2->4>6了,同时B流也从节点4截流出1(总共是1)走4->6而不是4->2->5->6,相当于AB流做加法.简单的说反向弧为今后提供反悔的机会,让前面不走这条路而走别的路.