一、前言
上课时,有些同学对算法的解释是错误的,好像不是非常清楚做法的原理(?),在此写一篇 blog 记录原理赠与自己与他人。
二、算法
1.无源汇上下界可行流
nnn 个点,mmm 条边,每条边 eee 有一个流量下界 lower(e)lower(e)lower(e) 和流量上界 upper(e)upper(e)upper(e),求一种可行方案使得在所有点满足流量平衡条件的前提下,所有边满足流量限制。
做法:
我们的网络流算法只能处理:源汇两点不要求流量守恒,边只有上届。
容易相当让每一条边都先流走一个 lower(e)lower(e)lower(e),然后考虑每个点的流量平衡。
记每一条边流走一个 lower(e)lower(e)lower(e) 后的图为 G′\mathbb{G'}G′
Δ(u)=∑(fro,u)∈Ef(fro,u)−∑(u,to)∈Ef(u,to)\Delta (u) = \sum_{(fro, u) \in E} f (fro, u) - \sum_{(u, to) \in E} f (u, to)Δ(u)=∑(fro,u)∈Ef(fro,u)−∑(u,to)∈Ef(u,to)
(含义:uuu 点需要向外流的流量,为负表示需要接受 −Δ(u)-\Delta (u)−Δ(u) 的流量)
V1={u∣delta(u)>0},V2={u∣delta(u)<0}\mathbb{V_1} = \{ u | delta (u) > 0 \}, \mathbb{V_2} = \{ u | delta (u) < 0 \}V1={u∣delta(u)>0},V2={u∣delta(u)<0}
相当于我们现在要通过一些满足上界的路径,将 Δ\DeltaΔ 为正的点的流量流给 Δ\DeltaΔ 为负的点。
分别建立一个虚拟源汇点 s,ts, ts,t。
sss 向所有 Δ(u)>0\Delta (u) > 0Δ(u)>0 的点连一条 (s,u,Δ(u))(s, u, \Delta (u))(s,u,Δ(u))。
所有 Δ(u)<0\Delta (u) < 0Δ(u)<0 的点向 ttt 连一条 (u,t,Δ(u))(u, t, \Delta (u))(u,t,Δ(u))。
相当于我们从 sss 强推给 V1\mathbb{V1}V1(需要向外流的点)Δ(u)\Delta (u)Δ(u) 的流量,让他们在 G′\mathbb{G'}G′ 中乱流,最后全部流到 V2\mathbb{V_2}V2(需要从外面接受流量的点),使所有 V2V_2V2 的点都得到 −Δ(u)-\Delta (u)−Δ(u) 的流量,然后再 通过 V2V_2V2 留给 ttt。
这样的话,如果最后 ttt 得到的流量等于 ∑u∈V2−Δ(u)\sum_{u \in \mathbb{V_2}} -\Delta(u)∑u∈V2−Δ(u),说明所有的 V2\mathbb{V_2}V2 的点都从V1\mathbb{V_1}V1 得到了 −Δ(u)-\Delta (u)−Δ(u) 的流量,只有这样才能满足流量平衡。
436

被折叠的 条评论
为什么被折叠?



