前言:
下面写得只是一些十分基础的东西,是给我以后自己看的,想要彻底弄明白这个内容,推荐去看liu_runda。
注:为了方便,下面所有的(x,y,L,R)都表示一条从x连向y,流量下界为L,流量上界为R的边。
1、无源汇上下界可行流:
问题简述:
给出一个有向图,每条边有流量上下界,没有源点和汇点,要求找到一种流的方法,使得每个点流入的流量与流出的流量相等,且每条边的流量都要满足上下界。
建图方法:
用一个数组 v v 储存每个点流入流量与流出流量的差.。对于(x,y,L,R),建一条x到y,流量为R-L的边,;之后扫一遍点,若 v[x]>0 v [ x ] > 0 ,建一条超级源点 SS S S 到 x x 流量为的边;否则建一条 x x 到超级汇点,流量为 −v[x] − v [ x ] 的边,然后跑一遍最大流。
判断是否有解:
扫一遍超级源点连出去的所有边,若全部满流则有解,否则无解。
2、有源汇上下界可行流:
问题简述:
给出一个有向图,每条边有流量上下界,有源点 S S 和汇点,要求找到一种流的方法,使得源点 S S 的流出量等于汇点的流入量,除源点汇点之外每个点流入的流量与流出的流量相等,且每条边的流量都要满足上下界。
建图方法:
注意到源点的流出量等于汇点的流入量,那么可以建一条 T T 到的流量为inf的边,那么就转化为上面的无源汇上下界可行流的问题,按照上面的方法建图即可。
判断是否有解:
同上。
3、有源汇上下界最大流:
问题简述:
给出一个有向图,每条边有流量上下界,有源点 S S 和汇点,要求找到一种流的方法,使得源点 S S 的流出量等于汇点的流入量,除源点汇点之外每个点流入的流量与流出的流量相等,且每条边的流量都要满足上下界,满足这些前提的情况下,要求流量最大。
建图方法:
对于(x,y,L,R),建一条超级源点 SS S S 到 y y 的流量为L的边,一条到超级汇点 TT T T 的流量为L的边,一条 x x 到的流量为R-L的边,最后建一条汇点 T T 到源点流量为inf的边。
判断是否有解及求最大流:
判断是否有解的方法与前面的一样。
找最大流有两种方法:
首先一开始都要跑一次
SS
S
S
到
TT
T
T
判断是否有解,以下都是在进行了第一次网络流的情况下进行的。
1、把最大流的初始值设为
T
T
到这条边的流量,把
SS
S
S
连出去的边清掉,把
T
T
到的边删掉,再在残量网络上跑一次
S
S
到的最大流,初始最大流加上这次的最大流就是答案。
2、直接跑一次
S
S
到的最大流即为答案。
4、有源汇上下界最小流:
问题简述:
给出一个有向图,每条边有流量上下界,有源点 S S 和汇点,要求找到一种流的方法,使得源点 S S 的流出量等于汇点的流入量,除源点汇点之外每个点流入的流量与流出的流量相等,且每条边的流量都要满足上下界,满足这些前提的情况下,要求流量最小。
建图方法:
与有源汇上下界最大流一样。
判断是否有解及求最小流:
判断是否有解的方法与前面的一样。
找最小流:
把最小流的初始值设为
T
T
到这条边的流量,把
SS
S
S
连出去的边清掉,把
T
T
到的边删掉,再在残量网络上跑一次
T
T
到的最大流,初始最小流减去这次的最大流就是答案。