最大流最小割算法入门理解
2015-04-14 13:31
323 查看
最近在看maxflow相关的资料,本文主要介绍下自己对最大流和最小割的理解。最大流本来是网络流方面的算法,后来在计算机视觉中也得到广泛的应用,如图割。我觉得要理解一个算法首先要从起源开始,然后再去泛化问题、建立模型,最后才是解决之。本文是以一个新手的角度去理解算法。
首先从最简单的开始,先看一幅图:
![](http://img.blog.csdn.net/20150414132749465)
有3个节点S,a,T,边[S,a]的容量是10,边[a,T]的容量是5,假设从S处要传送数据到T,问最大传送数据量是多少?应该是min(10,5)=5.如果超出5,[a,T]边容不下,因此传不过去,此时的最大流量就是5,[a,T]边就是该图的一条最小割。该图可以想象成从S到T通水,需要修建水管,a是中间站点,S到a修建的水管可以容纳下10单位的水量,a到T可容下5单位的水量,现在有个人不想让S到T通水了,那么他得要切割水管,那么应该切割哪条水管呢?假设切割水管付出的代价和水管容量成正比。显然,他需要切割a到T的水管,而不会切割S到a的水管,此时的割是最小割,容量是5,最大流是5,所以最大流=最小割。当然这个例子太简单,不能说明普遍问题。
来个稍微复杂的例子:
![](http://img.blog.csdn.net/20150414132840181)
从S到T,中间经过a,b两节点,问此时的最大流是多少?
首先找一条从S到T的路径[S,a,t],该路径的最大流量是min(2,3)=2,因为[S,a]上面的容量已经被用了,所以路径[S,a,b,t]就行不通了,割去[S,a]后图变成了以下形式:
![](http://img.blog.csdn.net/20150414132905830)
该图叫做残留网络或者叫残留图,此时再找从S到t的路径[S,b,t],路径的最大流量是min(3,6)=3.割去[b,t]后,图如下:
![](http://img.blog.csdn.net/20150414133032236)
此时就不存在从S到t的可行路径了,则结束最大流的查找。此时的最大流是2+3=5,被割的边容量和是2+3=5,即最大流=最小割。
两个例子我们已经能理解最大流和最小割大体的含义了,也发现最大流的确和最小割是相等的。只从这两个小例子就证明最大流和最小割相等是绝对不严格的,严格的数学证明可google相关资料。回头思考下,最大流到底是什么?如果以送货为例,在可行的情况下,从一个节点到另一个节点所能送达的最大货量即为最大流。打个比方,假设从S处开始放弹珠,让其自动滚到t处,箭头方向为下坡路,在不考虑时间和空间(即把弹珠想象成质点)的情况下,路径中能容纳的最大弹珠量即为最大流量,最小割就是把容纳的弹珠量和容量相同的边都割去,得到的割即为最小割,显然最大流=最小割,因为最大流量完全由路径和容量决定。割去这些边之后,弹珠是没法从S滚落到t的。
首先从最简单的开始,先看一幅图:
有3个节点S,a,T,边[S,a]的容量是10,边[a,T]的容量是5,假设从S处要传送数据到T,问最大传送数据量是多少?应该是min(10,5)=5.如果超出5,[a,T]边容不下,因此传不过去,此时的最大流量就是5,[a,T]边就是该图的一条最小割。该图可以想象成从S到T通水,需要修建水管,a是中间站点,S到a修建的水管可以容纳下10单位的水量,a到T可容下5单位的水量,现在有个人不想让S到T通水了,那么他得要切割水管,那么应该切割哪条水管呢?假设切割水管付出的代价和水管容量成正比。显然,他需要切割a到T的水管,而不会切割S到a的水管,此时的割是最小割,容量是5,最大流是5,所以最大流=最小割。当然这个例子太简单,不能说明普遍问题。
来个稍微复杂的例子:
从S到T,中间经过a,b两节点,问此时的最大流是多少?
首先找一条从S到T的路径[S,a,t],该路径的最大流量是min(2,3)=2,因为[S,a]上面的容量已经被用了,所以路径[S,a,b,t]就行不通了,割去[S,a]后图变成了以下形式:
该图叫做残留网络或者叫残留图,此时再找从S到t的路径[S,b,t],路径的最大流量是min(3,6)=3.割去[b,t]后,图如下:
此时就不存在从S到t的可行路径了,则结束最大流的查找。此时的最大流是2+3=5,被割的边容量和是2+3=5,即最大流=最小割。
两个例子我们已经能理解最大流和最小割大体的含义了,也发现最大流的确和最小割是相等的。只从这两个小例子就证明最大流和最小割相等是绝对不严格的,严格的数学证明可google相关资料。回头思考下,最大流到底是什么?如果以送货为例,在可行的情况下,从一个节点到另一个节点所能送达的最大货量即为最大流。打个比方,假设从S处开始放弹珠,让其自动滚到t处,箭头方向为下坡路,在不考虑时间和空间(即把弹珠想象成质点)的情况下,路径中能容纳的最大弹珠量即为最大流量,最小割就是把容纳的弹珠量和容量相同的边都割去,得到的割即为最小割,显然最大流=最小割,因为最大流量完全由路径和容量决定。割去这些边之后,弹珠是没法从S滚落到t的。
相关文章推荐
- 最大流最小割算法入门理解
- 数组复习及Scanner类 ,及对最大值,最小值、平均数、求和等基本算法的理解
- HDU 3549 Flow Problem 最大流 最小增广路 EK算法 传说中的入门算法
- (教你彻底理解)网络流:基本概念与算法 最大流最小割
- 算法入门:最少比较次数求最大/最小/第二大元素
- 算法(7)最大值和最小值
- 最小生成数prim算法理解
- 算法训练 最大最小公倍数
- STL_算法_最小值和最大值(min_element、max_element)
- 时间复杂度最小的 求两个整数最大公约数算法
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 网络流入门--最大流算法Dicnic 算法
- 最小公倍数与最大公因素算法
- C++ STL 算法:最大值和最小值
- ios 数组最大值,最小值,平均值,和的快速算法
- 算法 求最小值,最大值,中位数,顺序统计量
- HDU 2063 过山车(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- POJ3041《Asteroids》方法:匈牙利算法(最小点覆盖数==最大二分匹配数)
- 蓝桥杯 算法训练 最大最小公倍数