最大流计算机学院刘庆晖qhliu@bit.edu.cn参考资料:Cormen等,算法导论(影印,中译版),机工.最大流问题•有向图G=(V,E),容量c:ER+,源s,汇t,•求容量限制下,能从s运送到t的最大量•若在边(u,v)上运送单位物质费用为h(u,v),则有最小费用最大流问题sv1v3v2v4t1613104122047914能否观察出最大流的上界?流,流量,最大流sv1v3v2v4t11/168/13101/412/1215/204/47/74/911/14•称f:VVR为流,若f满足:(1)容量限制,f(u,v)c(u,v)(2)反对称性,f(u,v)=-f(v,u)(3)流守恒性,任意uV\{s,t},vVf(u,v)=0•流量|f|=vVf(s,v).•最大流:给定流网络G,s,t,c,求max{|f|:f是G的流}流网络,残余网络•假设任意vV,有从svt的路径•容量c:V×V→R+,(u,v)E:c(u,v)0;(u,v)E:c(u,v)=0.•流网络:有向图G=(V,E),s,t,c.•流f的残余流量,cf(u,v)=c(u,v)-f(u,v).•残余网络,Gf=(V,Ef),Ef={(u,v)|cf(u,v)0}sv1v3v2v4t11/168/130/101/412/1215/204/47/74/911/14sv1v3v2v4t58113121547411115535增广路径sv1v3v2v4t58113121547411115535•增广路径:Gf中从s到t的一条简单路径•增广路径的残余容量:若p为增广路径,则称cf(p)=min{cf(u,v):(u,v)p}为p的残余容量,是Gf中能沿p传输的最大量.sv1v3v2v4t51211312194711111931两个性质•引理.给定G=(V,E),s,t,c,f,Gf.设p为一条增广路径,定义fp(u,v)=cf(p),若(u,v)p=-cf(p),(v,u)p=0,else则fp是Gf上的流,|fp|=cf(p).•推论给定G=(V,E),s,t,c,f,Gf.p是Gf上的增广路径,则f+fp是流且|f+fp||f|.流网络的割•割(S,T):(1)T=V-S(2)sS,tT.•f(S,T)=uS,vTf(u,v):f穿过割(S,T)的净流•c(S,T)=uS,vTc(u,v):割(S,T)的容量•例.下图中的割(S,T),S={s,v1,v2},T={v3,v4,t}.f(S,T)=19,c(S,T)=26.sv1v3v2v4t11/168/13101/412/1215/204/47/74/911/14←ST→最大流最小割定理•f(S,T)=|f|,|f|min{c(S,T)|割(S,T)}.•定理(最大流最小割)下列条件等价(1)f是G的一个最大流;(2)Gf不包含增广路径;(3)存在割(S,T)使得|f|=c(S,T).•最大流算法基本思想:找从s到t的增广路径,增大流,无则停止,得最大流•最小费用最大流算法基本思想:以单位运费为边权,找从s到t的最短增广路径.算法复杂度Ford-Fulkerson,容量为整数,O(|E||f*|)Edmond-Karp,O(|V||E|2)一般push-relabel,O(|V|2|E|)SAP,O(|V|2|E|)Dinic,O(|V|2|E|)预流推进,O(|V|3)最大流题目选讲•1.Dinning•FarmerJohn的牛饿了,到了午餐时间需要吃饭和喝饮料,现在已知有n头牛,a种食物和b种饮料,每头牛都有一些食物和饮料是喜欢的,牛们只会吃喜欢的食物和喜欢的饮料,每种食物和饮料只有一份,现在请问最多有多少头牛能够吃到喜欢的食物和饮料。最大流题目选讲•增加源点src与汇点dst,src到每种食物连一条容量为1的边,保证每种食物只用一次,同理每种饮料到汇点连一条容量为1的边,保证每种饮料只用一次。•将每头牛拆成两个点,中间连一条容量为1的边,保证每头牛只用一次,没种食物到喜欢他的牛左侧的点连容量为INF的边,每头牛右侧的点到每种饮料连容量为INF的边,求最大流即可。最大流题目选讲•2.喜羊羊与灰太狼•在一个M*N的方格形地图上,有一些格子中有羊,有一些格子中有狼,还有一些格子是空地,每个格子内最多只能有一只狼或羊,先要沿着格子边沿修建围墙,请问最少修建多长的围墙能够将狼和羊隔开。最大流题目选讲•实际上是一个多源汇最小割问题,我们把地图中每个方格作为网络中的一个节点,任意相邻两个方格建立双向容量为1的边。•此时我们假设有狼的格子为源点,有羊的格子为汇点,显然只要有从任意源点到达任意汇点的一个流,则说明狼可以通过这条路径吃到羊,所以只要割断这个图就可以隔开狼和羊,而每割断一条边正好对应修建一段墙,原问题也就成功转化为多源汇最小割问题。•为解决问题,我们添加超级源点src和超级汇点dst,src到每个狼的格子有容量为INF的边,每个羊的格子到dst有容量为INF的边,在此网络中由最大流最小割定理,求出最大流即为答案最大流题目选讲•3.能量矩阵•在一个M*N的方格矩阵中,每个格子都有一个能量值且能量值为正,现在已知在此矩阵中相邻的两个格子的能量会发生冲突而抵消,现在请问最多能从该矩阵中获得多少没有冲突的能量•34•42theansweris8;最大流题目选讲•问题的转化•虽然原问题问最大能量值,我们可以将其转化为求最小的问题,即先选出所有的能量块,然后求最少去掉多少能量可以使得选出的能量块中没有冲突,于是问题变成了最小割!!!•建图•要将相邻的能量块分开,于是想到对矩阵进行黑白染色,白格在一侧,黑格在另一侧,建立一个二分图,此时相邻的两个格子一定在图的两侧,从白格向相邻的黑格建容量为INF的边。同时添加源点src和汇点dst,从src想每个白格点引容量为此格中能量值的边,从每个黑格点向dst引容量为此格中能量的边,求最小割总能量减去最小割即为答案!!!最大流题目选讲•4.双核CPU•现有一个双核CPU,有n个任务,我们已知任务Ti在A核上运行的开销为Ai,在B核上运行的开销为Bi,由于某些任务之间存在联系,使得这样的两个任务Ta和Tb如果运行在两个不同的核上会有额外开销c,现同时也已知这样的任务对以及其额外开销,请问在此CPU上完成全部n个任务的最小开销最大流题目选讲•经典最小割建模题之一•将每个任务当做一个节点,添加源点src和汇点dst,从src想每个任务引容量为该任务在A核上开销的边,从每个任务向dst引容量为该任务在B核上开销的边。对于每个存在不同核运行额外开销的任务对u,v而言,在u和v之间建立容量为额外开销的双向边。•至此我们发现,只要存在一个src到dst的流,就说明至少有一个任务没有分配,于是分配所有任务需要割断此网络,求最小割即为答案!!!最大流题目选讲•5.越狱•现有一囚犯越狱,需要通过一块长为l宽为w的空地,先已知这块空地上有n个守卫,每个守卫的坐标已知,同时每个守卫都有一个监控范围r,也就是说囚犯进入以某个守卫为中心半径为r的圆内就会被发现,越狱行动失败,现在为了成功越狱,此人决定干掉一些守卫,请问最少干掉多少个守卫就能够成功越狱而不被发现。最大流题目选讲•同为经典最小割问题•看似是一道计算几何问题,然而我们发现,我们并不关注也无法求出一条逃脱路径,只关注需要干掉的守卫数,也就是干掉最少的守卫能够通过与最小割接近!!!•选取地图上边界为源点src,下边界为汇点dst。将每个守卫拆成两个点Pi和Pi’,从Pi向Pi’连容量为1的边。然后如果第i个守卫的监视范围到达上边界,则从src到Pi连容量为INF的边,如果第i个守卫的监视范围到达下边界,则从Pi’向dst连容量为INF的边。如果第i个守卫和第j个守卫距离小于2*r,则从Pi’向Pj,Pj’向Pi同时连容量为INF的边,求最小割即为答案!!!费用流•费用流问题是在原网络流问题的基础上,对每一段路径加上一个单位流量费用Ci,也就是说,如果此段上有Fi的流量的话,将会花费Fi*Ci的费用,在此条件限制下,求出一个网络的最小(最大)费用的最大(最小/可行)流。•此类问题既需要求出流量,也需要求出费用最小费用最大流•最小费用最大流问题是费用流中最常见的一类问题,也就是在求出一个网络的最大流的同时求出获得此最大流的最小费用。•常用算法:消圈算法、最小费用路算法最小费用路算法•求解最小费用最大流的最小费用路算法其实思路非常简单,也就是在原求最大流的EK算法的思路基础上,每次通过SPFA算法在残余网络中寻找到一条当前网络的最小费用可增广路,然后对此路径进行增广,直至网络不可增广为止。最小费用可行流•一类特殊的最小费用流问题,指在原图中本身即含有负费用的网络中,寻找一个最小费用的流使得费用最小(费用为负才有意义)但不保证流量最大的一个流.•算法也很简单,在原来最小费用路算法基础上,只要本次SPFA算出的最小费用路费用为正即停止增广即可。带权二分图匹配•最大匹配同时求最大权:最小费用最大流•最大权匹配不要求最大匹配:最小费用可行流费用流例题•区间覆盖•给定一个数轴上的区间,现在可以对此区间进行覆盖,每次可以选择覆盖从ai到bi的一段区间,然后可以获得ci的收益,但是数轴上的任何一部分都不能被覆盖超过k次,请问覆盖此区间的最大收益是多少好好学习天天向上