有上下界的网络流——全家桶详解,后附例题

引言

⌊ \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 1n200,1m10200

Solution

一种初步的想法是:将旧网络图中每条边的流量,定义为其上界减去下界;从而组成新网络图。然后直接在新网络图搜出可行流即可。

但是这么做会出现一个致命的问题:旧图中对应的 ⌊ \lfloor 实际流量 ⌉ \rceil 不满足 ⌊ \lfloor 流量平衡 ⌉ \rceil 。例如:

在这里插入图片描述
原图中 1 → 2 → 3 1 \to 2 \to 3 123 不是可行流,但在新图中它却成为了一条可行流。

仔细分析一下这一个反例,我们会发现:在新图中 1 → 2 1 \to 2 12 流了 20 20 20 个单位,在原图中对应着 40 40 40 2 → 3 2 \to 3 23 流了 20 20 20 个单位,在原图中对应着 70 70 70 ,不满足流量平衡,从而出现了上面的反例。

考虑通过建立一些 ⌊ \lfloor 虚边 ⌉ \rceil 使得对应的原图满足流量平衡。

令第 i i i 个点的点权 a i a_i ai 为其 ⌊ \lfloor 所有入边的下界和 ⌉ \rceil 减去 ⌊ \lfloor 其所有出边的下界和 ⌉ \rceil

  1. a i > 0 a_i >0 ai>0 ,则从 i i i超级汇点连一条流量为 a i a_i ai 的边;
  2. a i ≤ 0 a_i \le 0 ai0 ,则从超级源点 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 1n200,1m10200

Solution

相比 Part 1 ,这里对源点与汇点的位置提出了要求,我们该怎么办呢?

不难发现,此时的源点与汇点可以不满足流量平衡。换句话说,流入源点的量与流出源点的量不一定要相等,汇点同理。

但是计算机不会知道这一点,它跑出来的流必然满足流量平衡。于是我们去考虑,通过添加虚边去完成这一点。

直接从汇点向源点连一条下界为 0 0 0 ,上界为 ∞ ∞ 的边就行了。此时, s → ⋯ → t → s s \to \cdots \to t \to s sts 形成了一个循环流,一定满足流量平衡。同时,这条边也没有影响最大流的流法。

于是在加入新边之后跑最大流,再按照 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 1n202,1m9999

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 1n202,1m9999

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 1n202,1m9999

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+eGcoste×le

例题

东方文化贴

Description

传送门

Solution

模板题。

建立一个二分图,左边是 ⌊ \lfloor ⌉ \rceil ,右边是少女,然后套路地连边即可。

CF708D

Description

给定一个网络图,每条边都有一个容量流量

可惜这个网络图并不合法。更为具体地说,可能存在边的容量小于流量,或者存在点不满足流量平衡。

你可以花费 1 1 1 个代价去将一条边的容量或流量增加或减少 1 1 1 。现在,请你求出,要让这个网络图合法的最小代价。

1 ≤ n , m ≤ 100 1 \le n,m \le 100 1n,m100

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 fc
(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 cf ,费用为 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 fc
(1)将 f f f 减小但依然大于当前的 c c c:从 v v v u u u 连一条流量为 f − c f-c fc ,费用为 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) 。妙题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值