网络流的最大流

 

适合已经对网络流有一点想法但不是很清楚的人看。所有图均盗用别人的。

 

只需要知道的概念:

C[u][v]:从u到v这条边可以一次性通过的容量。

F[u][v]:从u到v这条边目前流过了多少的流量(即已经cut掉C[u][v]的多少了)。

 

下面可以开始看图了:

 

      

  假设上图是已经知道的一些容量的使用状况,可以看到从S出发已经流出4点流量了。可是图中还有路径可以继续增大从S出来的流量(你怎么知道?),且听我讲个故事(关于上图现况的由来)。

  有一天老大带领一班马仔在S处为寻找建筑物t避难,但是苦于不知道一次可以去几人,怎么去,所以他只能“试试看”了。

  于是老大看到眼前有条路写着只允许4人通过,且通过对应的人数后会封掉相应人数的路,除非有人回来,就可以恢复相应人数的道路。那么他派出4个小将出马,4人一块出发来到V1客栈歇息(S-V1路被封),商量下一步的路程该如何走更合适。其中一位小将看到有一条路V1-V2,但是路上写了只允许两人通过,且通过后就会封路。没办法,其中两位先出发了去到V2,很快,他们找到了t的所在,就停在了那里。那剩下的两位可如何是好?他们苦苦寻找它路(别忘了V1-V2这条路已经被封),在雾散后一眼就看到了建筑物t,于是他们直接往t奔去,同样,这条路是4人车道,过了两人,当然就封掉2条车道了。很好,他们4人皆完成了任务,果然不负众望。

  接下来,老大又要想办法运输小弟过去了,因为没人会来,那么肯定是全部到达了。老大又看到一条路S-V2,好路,又可以送3人过去了,3人打包好行李出发。到了V2客栈时,“我勒个去,眼前V2-t的路被封了,V1-V2又是单行道,这可怎么办?是哪个兔崽子抢先了我们一步,难道就这样回去了?”。他们无路可走怎么办才好?

 

 

 

  如果我们将实际不存在的反向边(不解释这玩意是什么了)给标出来的话,情况又会如何? 请看详细报道:

      

  话说,在前4位小将走过之后,他们留下了如此的一番地图,可以看到刚才那3个人的小分组还没有出发。那就开始出发吧,同样,他们还是来到了V2客栈,“咦!!这次竟然有一条路???之前的好路竟然被占了,是哪个XXX干的?既然你不仁,我也不义,那就占别人的路,管他呢!!”  由于只能过2人,其中2人先赶紧出发,留下1个小伙子灰心丧气走回S去了(记得把路给恢复,可能还有人可以出发)。这2人最后肯定到达了t了。他们很不道德,这路不近他们,但是由于被占用了,所以只能占别人的路了。于是又可以画出“残余网络”图(自己画!!这么懒)。

  画完发现从s 出发无论多少人,竟然没送走1个。说明没有增广路了。上边那个3人小分组的例子说明,路是可以互相占用的,只要有路。其实相当于他们只是走回了各自该走的路。所以V1-V2这条路被抵消了,其实是可以没人走过这条路的。由于增加了反边,使得他们最终走上了正途,正好流量也是最大的。注点是,每次增广只能找到1条路径,多条就有危险

 

   那最小割是什么意思?

  当增广路算法在最后一轮BFS时找不到任何路径到达终点时,已经进过队列的那些节点,就是一个集合S,剩下的节点是另一个集合T,那么S-T就是一个最小割。意思是,任意边u-v(u属于S,v属于T)的容量加起来就是最大流了。

 

 

 

 

 

图盗自 http://blog.csdn.net/y990041769/article/details/21026445 

 

posted @ 2015-07-12 13:08  xcw0754  阅读(185)  评论(0编辑  收藏  举报