小媛原创啊,哇咔咔~~
1、剩余图,简单来说即边的容量为总容量 - 当前流量。
2、层次图,即从源点开始,生成的一颗BFS树,可以这么理解,树的高度 - 当前树的高度即为层次编号。
由此可知,层次图的构建需要用BFS去找,相当于BFS的时间戳了都。
而dinic的BFS函数是判断汇点是否在从源点开始找的层次图里。
我觉得dinic与EK的区别之处在于,EK是用BFS去找增广路,而dinic是在层次图里用DFS找增广路。
引用下http://acm.hrbeu.edu.cn/forums/index.php?showtopic=3003这个里面的一段话
采用DFS非递归的形式实现找增广路。也许你蒙了,这怎么还用DFS啊,明显不如BFS啊。但是你别忘了,你现在是在标号后的图中找增广路,DFS实际上也不必BFS差到哪里去。而且DFS的优点在于它可以找到所有的路径,这个是BFS无法媲美的。这样实现,我们就可以充分的利用了第一步的标号了。也许你会明白我的意思了,我们可以用一次标号找出多条增广路。这样的话效率不就大大的提高了。
那么如何去找呢 ?
类似于DFS,如果找到一个节点在层次图中,用它往下延伸,一直延伸到汇点,如果存在,就在这条路上找最小容量,增广之。
如果增广后,容量满了,阻塞之,实现方法即把这个点在层次图里的编号赋为其它点到不了的值,比如INT_MAX,-1。
如果不能到达汇点,这个节点返回上一层,继续找。
如果这个点都找完后(即上一层到达源点),再BFS从源点建立新的层次图,继续找。。。直到汇点不在新的层次图里结束。