无源汇可行流
模型
首先建立超级源$SS$和超级汇$TT$,然后对于一条<$x,y$>容量为$[b,c]$的弧,我们对该弧进行改造
连接一条<$SS,y$>容量为$b$的弧,连接一条<$x,TT$>容量为$b$的弧,然后把<$x,y$>的容量设置为$c-b$
图示
解释
通俗来讲,就是强行给$y$结点流进$b$的流量,强行从$x$结点流出$b$的流量,使得流量下界满足要求
然后<$x,y$>的$c-b$点流量就可以不受限制地随便流了,我们称之为自由流
如果与$SS$和$TT$相连的弧全部满流,则说明有可行流
理解了这个,下面的模型就是水到渠成了
例题
【LYIO#156】无源汇可行流
这是真·模板题
放个代码
|
|
有源汇最大流
模型
设源为$S$,汇为$T$
首先连接一条<$T,S$>的弧,流量为$+oo$,然后按照无源汇可行流的建模方法判断是否存在可行流
若存在可行流,则在残余网络上跑一遍从$S$到$T$的最大流,就是原图的最大流
解释
有源汇和无源汇的区别在于源点和汇点不满足流量平衡,所以我们建立弧<$T,S$>,使得源点和汇点满足流量平衡
这样就可以按照无源汇来求可行流了
跑完可行流之后,图中各条弧已经满足了流量下界的限制,所以只需要跑一边从$S$到$T$的最大流就是所求的答案
例题
【LYOI#157】有源汇最大流
这道也是真·模板题
贴个代码
|
|
有源汇最小流
建模
首先按照无源汇可行流的方法建模,在图上跑$SS$到$TT$的最大流
然后添加弧<$T,S$>容量为$+oo$,然后再跑$SS$到$TT$的最大流就是答案
解释
因为
所以我们要尽量多的消耗掉不需要经过
在添加弧
例题
【LYOI#158】有源汇最小流
直接上代码,但是注意,我的程序有点问题,被卡了一组超时,但大体思路无误
|
|
参考文献
- 《算法竞赛入门经典——训练指南》——刘汝佳
- 《上下界网络流建模方法总结》——stdcall 传送门