前言
补坑补坑
还债还债
参考了liu_runda的
前置
上下界:即一条边存在必须流过的流量与至多流过的流量,分别称为上界和下界
流量守恒:即满足一个点的流入流量=流出流量
可行流:问一张图是否存在每个点满足流量守恒且满足上下界限制的流
将以上条件称为基本条件
称一条边
(
u
,
v
,
d
o
w
n
,
u
p
)
(u,v,down,up)
(u,v,down,up)为从
u
u
u到
v
v
v,流量下界为
d
o
w
n
down
down,上界为
u
p
up
up的边
核心姿势
先让每条边满足下界,再调整流量
新建附加流
满足若原流中流出>流入,则附加流中流入>流出
反之亦然
无源汇可行流
图中不存在源汇,求是否有循环往复并满足基本条件的流
新建超级源
S
S
SS
SS,超级汇
T
T
TT
TT
对于原图中的每个点
i
i
i,我们记
d
[
i
]
d[i]
d[i]表示流入其的边的下界和减去其流出的边的下界和的差
若
d
[
i
]
<
0
d[i]<0
d[i]<0,
i
−
>
T
T
i->TT
i−>TT连一条流量为
−
d
[
i
]
-d[i]
−d[i]的边
否则,
S
S
−
>
i
SS->i
SS−>i连一条流量为
d
[
i
]
d[i]
d[i]的边
上一条边保证了在附加流的过程中多流入来补足的流量有地方可以离开
后一条边保证了在附加流的过程中存在有流可以补足流出的流
称如上的边为附加边
对于一条边
(
u
,
v
,
d
o
w
n
,
u
p
)
(u,v,down,up)
(u,v,down,up),我们做如下操作
u
−
>
v
u->v
u−>v连一条流量为
u
p
−
d
o
w
n
up-down
up−down的边
用于跑附加流
在新图中跑
S
S
−
>
T
T
SS->TT
SS−>TT的最大流
若所有附加边均满流,则存在可行流
此时可行流中的边的流量为其流量下界加上他在新图中的流量
有源汇有上下界可行流
图中存在源汇,求是否有从源到汇满足基本条件的流
我们发现只有源和汇是不存在满足流量守恒的情况的
所以在图中加入一条汇到源的流量无穷的边,让其满足流量守恒
此时图变成了无源汇的
故套用上面的算法求可行流即可
upd:不写一下不知道细节是啥…
注意原来的源汇都需要做如上的过程
在建
I
N
F
INF
INF边之前做这个操作
就是连向
S
S
,
T
T
SS,TT
SS,TT的过程
可行流的流量是多少?
即为新建的汇到源的无穷边的流量
有源汇有上下界最大流
在如上的基础上满足流量最大
先套用第二个算法求一次可行流,并记录可行流的流量
s
1
s1
s1
此后将新建的汇流向源的边删除
跑一次从源到汇的最大流
s
2
s2
s2
则最大流流量为
s
1
+
s
2
s1+s2
s1+s2
有源汇有上下界最小流
在满足第二个流的基础上满足流量最小
同样套用第二个算法求一次可行流,并记录可行流的流量
s
1
s1
s1
将新建的汇到源的边删除
此后跑一遍从汇到源的最大流
s
2
s2
s2
则最小流流量为
s
1
−
s
2
s1-s2
s1−s2
还有一种更简单的写法,套用第二个算法的最后不加上汇到源的这条无限边。先跑一边
S
S
SS
SS到
T
T
TT
TT的最大流
跑完之后再将汇到源这条无限边加上,再跑一次从
S
S
SS
SS到
T
T
TT
TT的最大流
此时这条无限边的反向边的流量即为最小流
有源汇有上下界最小费用流
按第一个流的方法建图
不同的是
原图中的边的费用正常
附加边费用为0
跑
S
S
−
>
T
T
SS->TT
SS−>TT最小费用流
则原图最小费用流为跑出的费用+原图中每条边的下界*其费用