文章目录
引言
⌊ \lfloor ⌊ 给定一个网络图与其源点、汇点,每条边都有其流量的上限。请你求出它的网络最大流。 ⌉ \rceil ⌉
这一道题目大家一定可以看出——这不是裸的最大流吗!跑一遍 Dinic 就完事啦!
但是,如果我们将题目进行一个转化:
⌊ \lfloor ⌊ 给定一个网络图与其源点、汇点,每条边都有其流量的上限以及下限。请你求出它的网络最大流。 ⌉ \rceil ⌉
这时,每条边都有了其流量的上下界,使用 Dinic 直接做似乎较为困难。
于是,本篇文章主要解决边流量有上下界的问题。
Part 1: 无源汇上下界可行流
Description
n n n 个点, m m m 条边,每条边都有一个流量下界和流量上界 。求一条可行流,使得在所有点满足 ⌊ \lfloor ⌊ 流量平衡 ⌉ \rceil ⌉ 的前提下,所有边满足流量限制。
1 ≤ n ≤ 200 , 1 ≤ m ≤ 10200 1 \le n \le 200,1 \le m \le 10200 1≤n≤200,1≤m≤10200
Solution
一种初步的想法是:将旧网络图中每条边的流量,定义为其上界减去下界;从而组成新网络图。然后直接在新网络图搜出可行流即可。
但是这么做会出现一个致命的问题:旧图中对应的 ⌊ \lfloor ⌊ 实际流量 ⌉ \rceil ⌉ 不满足 ⌊ \lfloor ⌊ 流量平衡 ⌉ \rceil ⌉ 。例如:
原图中
1
→
2
→
3
1 \to 2 \to 3
1→2→3 不是可行流,但在新图中它却成为了一条可行流。
仔细分析一下这一个反例,我们会发现:在新图中 1 → 2 1 \to 2 1→2 流了 20 20 20 个单位,在原图中对应着 40 40 40 ; 2 → 3 2 \to 3 2→3 流了 20 20 20 个单位,在原图中对应着 70 70 70 ,不满足流量平衡,从而出现了上面的反例。
考虑通过建立一些 ⌊ \lfloor ⌊ 虚边 ⌉ \rceil ⌉ 使得对应的原图满足流量平衡。
令第 i i i 个点的点权 a i a_i ai 为其 ⌊ \lfloor ⌊ 所有入边的下界和 ⌉ \rceil ⌉ 减去 ⌊ \lfloor ⌊ 其所有出边的下界和 ⌉ \rceil ⌉。
- 若 a i > 0 a_i >0 ai>0 ,则从 i i i 向超级汇点连一条流量为 a i a_i ai 的边;
- 若 a i ≤ 0 a_i \le 0 ai≤0 ,则从超级源点向 i i i 连一条流量为 a i a_i ai 的边。
从而,每个节点就都满足 ⌊ \lfloor ⌊ 流量平衡 ⌉ \rceil ⌉ 了。
不难发现,若每条虚边均被流满,那么在原图中对应的流即为一条可行流。于是我们在新图上跑最大流,并判断这个值是否小于虚边的流量之和。若小于,则不存在可行流;否则存在可行流。
令第 i i i 条边在新图中的流量为 f i f_i fi ,其下界为 l i l_i li ,则实际流量为 f i + l i f_i+l_i fi+li 。
Part 2: 有源汇上下界可行流
Description
n n n 个点, m m m 条边,有源点 s s s 和汇点 t t t ,每条边都有一个流量下界和流量上界 。求一条从源点到汇点的可行流,使得在所有点满足 ⌊ \lfloor ⌊ 流量平衡 ⌉ \rceil ⌉ 的前提下,所有边满足流量限制。
1 ≤ n ≤ 200 , 1 ≤ m ≤ 10200 1 \le n \le 200,1 \le m \le 10200 1≤n≤200,1≤m≤10200
Solution
相比 Part 1 ,这里对源点与汇点的位置提出了要求,我们该怎么办呢?
不难发现,此时的源点与汇点可以不满足流量平衡。换句话说,流入源点的量与流出源点的量不一定要相等,汇点同理。
但是计算机不会知道这一点,它跑出来的流必然满足流量平衡。于是我们去考虑,通过添加虚边去完成这一点。
直接从汇点向源点连一条下界为 0 0 0 ,上界为 ∞ ∞ ∞ 的边就行了。此时, s → ⋯ → t → s s \to \cdots \to t \to s s→⋯→t→s 形成了一个循环流,一定满足流量平衡。同时,这条边也没有影响最大流的流法。
于是在加入新边之后跑最大流,再按照 Part 1 中的方式确定每条边的实际流量就行了。
Part 3: 有源汇上下界最大流
Description
n n n 个点, m m m 条边,有源点 s s s 和汇点 t t t ,每条边都有一个流量下界和流量上界 。求从源点到汇点的最大流。
1 ≤ n ≤ 202 , 1 ≤ m ≤ 9999 1 \le n \le 202,1 \le m \le 9999 1≤n≤202,1≤m≤9999
Solution
我们按照 Part 2 所说的方法建立出新图,然后通过 Dinic 得到一条可行流。
此时,由于已经跑过一次最大流,所以当前的图已经满足流量平衡。于是,我们再在残量网络上跑一遍最大流即为答案。
注意,第一次跑最大流的 s s s 为超级源点, t t t 为超级汇点;第二次的 s s s 为源点, t t t 为汇点,且将这两次最大流加起来才是最终要输出的答案。
Part 4: 有源汇上下界最小流
Description
n n n 个点, m m m 条边,有源点 s s s 和汇点 t t t ,每条边都有一个流量下界和流量上界 。求从源点到汇点的最小流。
1 ≤ n ≤ 202 , 1 ≤ m ≤ 9999 1 \le n \le 202,1 \le m \le 9999 1≤n≤202,1≤m≤9999
Solution
没听懂,待补。
不过话说这东西有什么用
Part 5: 有源汇上下界最小费用最大流
Description
n n n 个点, m m m 条边,有源点 s s s 和汇点 t t t ,每条边都有一个流量下界、流量上界和单位流量的费用 。求从源点到汇点的最小费用最大流。
1 ≤ n ≤ 202 , 1 ≤ m ≤ 9999 1 \le n \le 202,1 \le m \le 9999 1≤n≤202,1≤m≤9999
Solution
依照 Part 3 ,我们建立出新网络图,然后直接跑最小费用最大流。
令这个值为
p
p
p ,那么
a
n
s
=
p
+
∑
e
∈
G
c
o
s
t
e
×
l
e
ans=p+\sum_{e \in G} cost_e \times l_e
ans=p+e∈G∑coste×le
例题
东方文化贴
Description
Solution
模板题。
建立一个二分图,左边是 ⌊ \lfloor ⌊ 天 ⌉ \rceil ⌉ ,右边是少女,然后套路地连边即可。
CF708D
Description
给定一个网络图,每条边都有一个容量与流量。
可惜这个网络图并不合法。更为具体地说,可能存在边的容量小于流量,或者存在点不满足流量平衡。
你可以花费 1 1 1 个代价去将一条边的容量或流量增加或减少 1 1 1 。现在,请你求出,要让这个网络图合法的最小代价。
1 ≤ n , m ≤ 100 1 \le n,m \le 100 1≤n,m≤100
Solution
考虑建出一张新图。
对于每一条形如 ( u , v , f , c ) (u,v,f,c) (u,v,f,c) 的原边,在新图中建立一条连接点 u , v u,v u,v ,流量上下界均为 f f f 的边。然后通过建立新边表示流量、容量的减少与增加。
分类讨论如下:
①若
f
≤
c
f \le c
f≤c,
(1)将
f
f
f 减小:从
v
v
v 到
u
u
u 连一条流量为
f
f
f,费用为
1
1
1 的边。
(2)将
f
f
f 增加且不超过当前的
c
c
c:从
u
u
u 到
v
v
v 连一条流量为
c
−
f
c-f
c−f ,费用为
1
1
1 的边。
(3)将
f
f
f 增加,并超过当前的
c
c
c。由于已通过
⌊
\lfloor
⌊ ①(2)中所连的边
⌉
\rceil
⌉ 将
f
f
f 增加到了
c
c
c ,所以连一条从
u
u
u 到
v
v
v ,流量为
∞
∞
∞ ,费用为
2
2
2 的边即可。
②若
f
>
c
f>c
f>c,我们先将答案加上
f
−
c
f-c
f−c 。
(1)将
f
f
f 减小但依然大于当前的
c
c
c:从
v
v
v 到
u
u
u 连一条流量为
f
−
c
f-c
f−c ,费用为
0
0
0 的边。
(2)将
f
f
f 减小并不大于当前的
c
c
c:从
v
v
v 到
u
u
u 连一条流量为
c
c
c ,费用为
1
1
1 的边。
(2)将
f
f
f 增大:从
u
u
u 到
v
v
v 连一条流量为
∞
∞
∞ ,费用为
2
2
2 的边。
跑有源汇上下最小费用最大流即可。
时间复杂度 O ( n m 2 ) O(nm^2) O(nm2) 。妙题。