有上下界网络流学习笔记

有上下界网络流学习笔记

1.有(无)源汇有上下界最小费用可行流:算法的核心思想是补流。先判断原图是否有源汇,若有则连边\(t \to s(\infty/0)\);随后新建超级源汇\(S\)\(T\);然后对于每一条边\(x \to y\),连边\(x \to y(high-low/w)\);接着对每一个点\(x\),计\(\delta\)为该点入边流量下界之和减去该点出边流量下界之和,如果\(\delta\)为正数,说明接下来有一部分流量要从\(x\)流出,则连边\(S \to x(\delta/0)\);若\(\delta\)为负数,说明需要有一部分流量流入\(x\),则连边\(x \to T(-\delta/0)\),最后做费用流在加上必须流的费用即可。

例1.Luogu4043 支线剧情

模板题,没啥好说的。

2.无源汇有上下界可行流:算法的核心是先建出初始流,再通过补充附加流,满足流量平衡(其实和1是一样的)。建立附加源汇\(S\)\(T\),然后对于每一条边\(x \to y\),连边\(x \to y(high-low)\);接着对每一个点\(x\),计\(\delta\)为该点入边流量下界之和减去该点出边流量下界之和,如果\(\delta\)为正数,说明接下来有一部分流量要从\(x\)流出,则连边\(S \to x(\delta)\);若\(\delta\)为负数,说明需要有一部分流量流入\(x\),则连边\(x \to T(-\delta)\)。如果我们能够找到使后面所有附加上的边都满流的方案,那么我们就得到了可行流,所以对新图做最大流即可。若存在方案,那么最后每条边的流量为最大流中的流量加上原图中的流量下界。

例2.ZOJ2314

仍然是模板题。

3.有源汇有上下界最小/最大流:连边\(t \to s(\infty)\),先用2中所述方法求出可行流,然后删去\(t \to s(\infty)\),从\(s\)\(t\)在原来的残量网络上增广即可得到最大流,因为这样既不破坏流量平衡,又不会不符合上下界,同时最大化了流量;最小流有两种做法:1.因为反向边的流量增加就是正向边的流量减小,最小流是正向边流量最小化,所以\(s \to t\)最小流就是反向边流量最大化,即\(t \to s\)最大流,设第一次增广中\(t \to s(\infty)\)的流量为\(x1\),删除\(t \to s(\infty)\)反过来增广最大流为\(x2\),那么最小流即为\(x1-x2\)。2.(这个做法我也不是很明白,如果有大佬知道原因,希望能给我讲解一下)先求超级源汇的最大流,然后连边\(t \to s(\infty)\),继续增广求超级源汇的最大流,答案即为新边\(t \to s(\infty)\)的实际流量,因为第一次增广时流量已经尽量往其他边流,那么加上这条新边后,就尽可能减小了最终答案。

例3.BZOJ2502

还有一些练习题,等我写了再贴在这吧。

posted @ 2019-03-21 21:45  pkh68  阅读(137)  评论(0编辑  收藏  举报