本文共 750 字,大约阅读时间需要 2 分钟。
早上困得不行,坐在电脑面前一直想睡觉。跑到教室外面的走廊上看《数据结构与算法》(java语言版)对Dinic算法的讲解。
其实这个算法理解起来不难。当然还没有编程实现,希望不会被认为站着说话不腰疼。 我的理解就是:不停的分层,然后不停的按层寻路!
分层:就是从汇点开始,所有与汇点相邻的点记录其层次为1,然后遍历整个层次为1的点,找与其相邻的点,记其层次为2……直到找到源点为止。所以很容易看出来,这必须用BFS搜索整个图。
寻路:按层次找出所有连接源点到汇点的路径。当然每找到一条就需要把这个层次中路径的流量更改。表示这条路已经有人买断了 呵呵 !一般而言,至少能找到一条满足条件的路径!如果符合条件的路已经全部找完,你需要做的很简单,再分层!然后再寻路。为了快速寻路,当然会用到DFS算法。
如果那一次分层后,你找不到路了,那么恭喜你!整个算法走到终结!可以回家吃饭了 呵呵 ……
所以书上会说:Dinic算法是BFS和DFS的综合运用!学了这么多天的图论算法过后,我终于渐渐能理解:“DFS和BFS是整个图论算法的基础”这句话了!无论是求最短路的Dijkstra,Bellman-Ford 还是求最小生成树的Prime、Kruskal ,或者求二部图匹配的Hungarian,或者求最大流的2F、Dinic 都是基于图的搜索,在此基础上增加一些搜索的条件或者过滤一些点而已!这里需要提一下的是 Floyd算法可能有些另类,但我们总需要一些与众不同的声音的存在吧!而且这种跳出框框的思维是很值得珍视的 !
有一个问题:我用2F算法实现并没有出现书上所说的小流量增量的循环。难道是我的2F基因突变了? 所以弄完2F我就直接跳到了Dinic,没有去研究EK算法了!先就写到这里,下去把算法实现再说吧!
转载地址:http://vlkax.baihongyu.com/