关于最大流 Dinic 算法的一些理解。

小媛原创啊,哇咔咔~~

 

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从源点建立新的层次图,继续找。。。直到汇点不在新的层次图里结束。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值