8.1
上午
网络流
定义
一个流网络 G = ( V , E ) G=(V, E) G=(V,E) 为一张满足以下条件的有向图:
1.每一条边有一个非负容量,即对于任意E中的 (u,v) , 有 c ( u , v ) ≥ 0 c(u, v) \geq 0 c(u,v)≥0
2.如果G中存在边 (u,v) ,那么不存在 (v,u) 。我们将图中不存在的边的容量定为0。
3.图中含有两个特殊节点:源 s 与汇 t。
一个流可看做是一个从VxV到R的映射,满足下面两条性质:
1.容量限制: 对于任意的 u,v, 0 ≤ f ( u , v ) ≤ c ( u , v ) 0 \leq f(u, v) \leq c(u, v) 0≤f(u,v)≤c(u,v)
2.流量守恒:对于任何非源汇的中间节点u,我们有
∑ v ∈ V f ( v , u ) = ∑ v ∈ V f ( u , v ) \sum_{v \in V} f(v, u)=\sum_{v \in V} f(u, v) v∈V∑f(v,u)=v∈V∑f(u,v)
最大流
最大流问题,即是找出一个满足上述条件的f,使得 ∑ ν ∈ V f ( s , v ) \sum_{\nu \in V} f(s, v) ∑ν∈Vf(s,v) 被最大化
最大流问题 -> 带反向边的最大流问题
多源汇最大流问题
一个流f的流量|f|定义为:
∣
f
∣
=
∑
v
∈
V
f
(
s
,
v
)
−
∑
v
∈
V
f
(
v
,
s
)
|f|=\sum_{v \in V} f(s, v)-\sum_{v \in V} f(v, s)
∣f∣=v∈V∑f(s,v)−v∈V∑f(v,s)
(由于在图G中不存在反向边,因而在上面的讨论中只需要最大化前半部分。 )
最大流建模
• 是否存在从s到t的可经过相同节点不经过相同边的两条路径?
• 是否存在从s到t的不可经过除s、 t外相同节点的两条路径?
• 是否存在从s到t的不可经过除s、 t外相同节点和相同边的两条路径?
点容量的解决办法:拆点,将容量限制转化到边上。
最大流算法-从几个基本想法开始
• 残量网络
• 对于网络G,其残量网络G_f与G的差别在于每条边的边容量修改为G中边容量减去当前流的该边流量。
具体来说, c f ( u , v ) = c ( u , v ) − f ( u , v ) c_{f}(u, v)=c(u, v)-f(u, v) cf(u,v)=c(u,v)−f(u,v)
• 另外,残量网络中还包含原图中所有边的反向边,容量等同于正向边在f中当前流量,用于“反悔” 时将流送回起点:
c f ( ν , u ) = f ( u , ν ) c_{f}(\nu, u)=f(u, \nu) cf(ν,u)=f(u,ν)
• 增广
• 令f’为残量网络G_f上的一个流
(
f
↑
f
′
)
(
u
,
v
)
=
{
f
(
u
,
v
)
+
f
′
(
u
,
v
)
−
f
′
(
v
,
u
)
if
(
u
,
v
)
∈
E
0
otherwise
\left(f \uparrow f^{\prime}\right)(u, v)=\left\{\begin{array}{ll}{f(u, v)+f^{\prime}(u, v)-f^{\prime}(v, u)} & {\text { if }(u, v) \in E} \\ {0} & {\text { otherwise }}\end{array}\right.
(f↑f′)(u,v)={f(u,v)+f′(u,v)−f′(v,u)0 if (u,v)∈E otherwise
• 引理1 : 增广后的网络的流量等于两个流流量直接相加。
∣ f ↑ f ′ ∣ = ∣ f ∣ + ∣ f ′ ∣ \left|f \uparrow f^{\prime}\right|=|f|+\left|f^{\prime}\right| ∣f↑f′∣=∣f∣+∣f′∣
证明:
a.根据两条限制证明是个流
b.流量相同
• 增广路
• 残量网络当中从s到t的一条简单路径
• 增广路p的流量定义为
c
f
(
p
)
=
min
{
c
f
(
u
,
v
)
:
(
u
,
v
)
is on
p
}
c_{f}(p)=\min \left\{c_{f}(u, v) :(u, v) \text { is on } p\right\}
cf(p)=min{cf(u,v):(u,v) is on p}
• 那么显然,若是将p上的每条边的流量均赋为c_ f( p ),所形成的依然是满足条件的原图的一个流。
• 结论1:增广后流量增加。 令f_p为当前流f的残量网络中找到的一增广路,则
∣
f
↑
f
p
∣
=
∣
f
∣
+
∣
f
p
∣
>
∣
f
∣
\left|f \uparrow f_{p}\right|=|f|+\left|f_{p}\right|>|f|
∣f↑fp∣=∣f∣+∣fp∣>∣f∣
• Q:如何能证明当我们找不到增广路时原图达到最大流?
• 在匹配算法中,可以通过对称差分两个匹配来证明
• 割
• 为一个对于点集V的划分,将V划分为两个集合S与T,其中源点s在S中,汇点t在T中。对于一个流f而言,割(S, T)间的网络流定义为
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
f(S, T)=\sum_{u \in S} \sum_{v \in T} f(u, v)-\sum_{u \in S} \sum_{v \in T} f(v, u)
f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)
• 割(S, T)的容量定义为:
c
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
c(S, T)=\sum_{u \in S} \sum_{v \in T} c(u, v)
c(S,T)=u∈S∑v∈T∑c(u,v)
• 对于一个网络而言,最小割为所有的割当中容量最小的那个。
引理2:对于任意流f,任意割之间的网络流量不变。 即
f
(
S
,
T
)
=
∣
f
∣
f(S, T)=|f|
f(S,T)=∣f∣
• 证明:可由流量守恒导出。
• 结论2:任意流f的流量不超过任意割的容量。 即
∣ f ∣ ≤ c ( S , T ) |f| \leq c(S, T) ∣f∣≤c(S,T)
• 证明:由引理2显然。
∣
f
∣
=
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
≤
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
≤
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
=
c
(
S
,
T
)
\begin{aligned}|f| &=f(S, T) \\ &=\sum_{u \in S} \sum_{v \in T} f(u, v)-\sum_{u \in S} \sum_{v \in T} f(v, u) \\ & \leq \sum_{u \in S} \sum_{v \in T} f(u, v) \\ & \leq \sum_{u \in S} \sum_{v \in T} c(u, v) \\ &=c(S, T) \end{aligned}
∣f∣=f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)≤u∈S∑v∈T∑f(u,v)≤u∈S∑v∈T∑c(u,v)=c(S,T)
• 定理1.最大流最小割定理: 对于一个网络G,下面三个命题总是等价
• 流 f 是 G 的最大流。
• 当前流 f 的残量网络 G_f 上不存在增广路。
• 存在某个割使得 |f| = c(S, T) 成立。由结论2可知,满足条件的割必定是最小割。
• 证明: (1) -> (2) 反证法,可由结论1直接导出矛盾。
(2) -> (3) 构造点集S为s在残量网络上能够到达的点集, T=V-S,那么t一定在T中,进而(S,T)是一个割。
考虑S、 T间的任意点对(u,v),如果(u,v)在原网络中存在,那么必定有f(u,v)=c(u,v),
否则该边会在残量网络中出现从而将u,v放入同一个连通块。
如果(v,u)在原网络中存在,那么必定有f(v,u)=0.
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
v
∈
T
∑
u
∈
S
f
(
v
,
u
)
=
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
−
∑
v
∈
T
∑
u
∈
S
0
=
c
(
S
,
T
)
\begin{aligned} f(S, T) &=\sum_{u \in S} \sum_{v \in T} f(u, v)-\sum_{v \in T} \sum_{u \in S} f(v, u) \\ &=\sum_{u \in S} \sum_{v \in T} c(u, v)-\sum_{v \in T} \sum_{u \in S} 0 \\ &=c(S, T) \end{aligned}
f(S,T)=u∈S∑v∈T∑f(u,v)−v∈T∑u∈S∑f(v,u)=u∈S∑v∈T∑c(u,v)−v∈T∑u∈S∑0=c(S,T)
由引理2得, |f|=c(S,T)。
• 证明: (3) -> (1),由结论2知, |f|<= c(S,T),故当等号取到时,等式右边必然是最小割,等式左边必然是最大流。
最大流算法-Ford-Fulkerson算法
• 正确性显然。 While内部的复杂度为 O(|E|),而寻增广路次数最高可达 O(|f * |),其中 f * 为 G 的最大流。总复杂度 O(|E||f *|)。
最大流算法-Edmonds-Karp算法
• 在Ford-Fulkerson算法的基础上,将寻增广路的过程优化为每次寻“最短”增广路的过程,其中路径长度定义为从s到t需要经过的边条数。
• 引理3 : 在EK算法中,令d(u)表示残量单位网络上从s到u的最短路距离。那么对于V-{s,t}中的任意u,在每次增广后d(u)不降。
• 证明: 考虑两次相邻的增广前后的流,从中选取满足d(u)降的且距离最近的u进行分析,并导出矛盾。
• 定理2: 在EK算法中,增广的次数是O(VE)的。
• 证明: 考虑在残量网络的一条增广路中充当“瓶颈”的边,在该次增广后必定会从残量网络中消失。考虑证明每条边最多消失O(V)次。加上一次增广必定会有至少一条这样的边,故最多增广O(VE)次。
• 故EK算法的总复杂度为O(VE^2)
下午
最大流算法-Dinic算法
• 在Edmonds-Karp算法的基础上,将每次寻找一条增广路优化为每次计算出一个增广网络。
• 在残量网络中,若两个端点间的最短路恰好差1,就称之为可行边。
• 由所有可行边构成的图(最短路图),称为可行网络。
• 在可行网络上的无法再扩充流量的流,称为阻塞流,注意不必是残量网络的最大流。
• 增广完一个阻塞流后, d(t)必增,因而最多增广O(V)次。
• 增广单次的实现和时间复杂度:(注意加上所有的优化)
• 一个节点的dfs至多被调用O(E)次。
• For循环外部的时间复杂度之和为O(VE)
• For循环执行次数可分为:只经过一次的和经过多次的
• 经过一次的复杂度之和为O(E)
• 经过多次的次数之和为O(VE)。
• 因此加了左边所有优化的dinic总复杂度为O(V^2E)
• 上面在某个可行网络上找阻塞流的算法过程
• 是按某种顺序找增广路,一旦找到就直接增广了
• 如果我们能够支持:
• 快速加边
• 找到增广路后查询瓶颈大小(路径最小值)
• 增广(路径加)
• 在残量网络中删边
• ……
• 仿佛一个动态树就可以了
阅读材料:
• https://www.arl.wustl.edu/~jst/cse/542/text/sec19.pdf
• http://courses.csail.mit.edu/6.854/16/Notes/n10-blocking_flows.html
• 可以使用动态树优化找阻塞流并增广的过程,迭代次数不变,因而可以达到**O(VElogV)**的复杂度。
• 单位容量网络:
• 所有的存在的边容量均为1的网络
• 引理4 : dinic在单位容量网络中至多增广O(min(E{1/2},V{2/3}))次
• 证明: d(t):起点到终点的最短路
• a. 增广次数不超过 O(E^{1/2})
• 分别考虑 d(t)<=E{1/2} 和 d(t)>=E{1/2} 时的情况
• 前者由于阻塞流增广后的性质,每次自然会增,因此只需要迭代不超过E{1/2}次就可到达后一种情形。
• 后者考虑层之间的割。由于存在超过E{1/2}层,因而必有两层间边数不超过E{1/2},由此可推出残量网络最大流不超过E{1/2}。由于每次增广必会增加流量,故只需增广不超过**E{1/2}**次。
• b. 增广次数不超过 O(V{2/3})
• 同理(考虑连续的两层之间的节点个数均不超V^{1/3}前后的情况)。
• 结论3 : dinic在单位容量网络中寻找阻塞流可达O(E)复杂度。
• 证明:依然可以分两部分
• Dfs调用 — 每个点所在增广路数量之和
• For循环 — 每条边所在增广路数量之和
• 因此,在单位容量网络当中, dinic的时间复杂度可达O(E min(E{1/2},V{2/3}))
• 单位网络
• 对于V-{s,t}中的任意一节点,都满足下面两条之一:
• a. 仅存在一条入度为1的边
• b. 仅存在一条出度为1的边
• 结论4 : dinic在单位网络中效率可达O(V{1/2}E)
• 证明: 与之前类似。
• 应用:在使用dinic跑二分图匹配时的复杂度可分析到O(mn1/2)
最小割的简单例子:最大权闭合子图
• 定义
• 给出一张有向图,其中每个点都有一个点权。
• 任务是选择一个权值和最大的子图,使得每个点的后继都在子图当中。
• 建图
• 令S集表示取, T集表示不取,原图中(u,v)连+oo的边。
• s连正权点,容量为权;负权点连t,容量为权的相反数。
• 正权点权值和-最大流即为答案。
• 证明
• a. 合法性:最终的S集导出一闭合子图
• b. 最优性:导出的为最大权闭合子图
• c(S,T) = min(不选的正权点边权和 - 选了的负权点边权和)
• ANS = 所有正权点边权和 – min(不选的正权点边权和 - 选了的负权点边权和)
= max(选了的正权点的边权和 + 选了的负权点边权和)
例题
总结:
网络流吧,讲的内容需要有些基础
显然我是没有的
所以听的不是很懂
表示这是个大坑
慢慢补吧
然后,这个博客里基本是课件内容
部分纸质证明来自mjy老师 (懒得打了)