图论与网络优化2

CSDN 有字数限制,因此笔记分别发布,目前:

  1. 【笔记1】概念与计算、树及其算法
  2. 【笔记2】容量网络模型

4.1 容量网络模型

4.1.1 容量网络

容量网络:如果一个加权有向网络 D D D 满足如下三个条件:①存在唯一一个入度为 0 0 0 的顶点,称为源;②存在唯一一个出度为 0 0 0 的顶点,称为汇;③每条弧 ( v i , v j ) (v_i,v_j) (vi,vj) 赋权 c i j c_{ij} cij 是一个非负数,称为弧 ( v i , v j ) (v_i,v_j) (vi,vj) 的容量,则把这个加权有向网络 D D D 称为容量网络。


4.1.2 流

:设 D D D 是一个容量网络,令 c i j c_{ij} cij 表示弧 ( v i , v j ) (v_i,v_j) (vi,vj) 的容量。设 f f f 是定义在 D D D 的弧集上的一个函数,它赋予每条弧 ( v i , v j ) (v_i,v_j) (vi,vj) 一个非负实数 f i j f_{ij} fij,若 f f f 满足:① f i j ≤ c i j f_{ij} \leq c_{ij} fijcij;② ∀ v j ∈ V ( D ) \forall v_j \in V(D) vjV(D) \ { v s , v t } \{v_s,v_t\} {vs,vt} ∑ ( v i , v j ) ∈ E ( D ) f i j = ∑ ( v j , v i ) ∈ E ( D ) f j i \sum_{(v_i,v_j)\in E(D)} f_{ij} = \sum_{(v_j,v_i)\in E(D)} f_{ji} (vi,vj)E(D)fij=(vj,vi)E(D)fji,则称 f f f 为容量网络 D D D 的一个流,称 f i j f_{ij} fij 为弧 ( v i , v j ) (v_i,v_j) (vi,vj) 上的流量。
(非)饱和弧:弧上的流量(未)达到弧的容量。


4.1.3 流值

定理:设 f f f 是容量网络 D D D 的一个流,其中源为 v s v_s vs,汇为 v t v_t vt,由源的流出量等于汇的流入量,即 ∑ ( v s , v j ) ∈ E ( D ) f s i = ∑ ( v i , v t ) ∈ E ( D ) f i t \sum_{(v_s,v_j)\in E(D)}f_{si}=\sum_{(v_i,v_t)\in E(D)}f_{it} (vs,vj)E(D)fsi=(vi,vt)E(D)fit
证明:注意到每条弧上的流量,既是其头顶点的流入量,也是其尾顶点的流出量,因此所有弧上的流量之和、所有顶顶啊的流入量之和、所有顶点的流出量之和,这三者相等。
流值:设 f f f 是容量网络 D D D 的一个流,其源为 v s v_s vs,汇为 v t v_t vt,称源的流出量为流 f f f 的流值,记作 v a l ( f ) val(f) val(f)


4.1.4 最大流

最大流:设 D D D 是一个容量网络,若 f f f D D D 上流值最大的流,则把 f f f 称为 D D D 的最大流。
:设 D D D 是一个容量网络,源为 v s v_s vs,汇为 v t v_t vt。设顶点子集 S ⊂ V ( D ) , S ‾ = V ( D ) S \subset V(D),\overline{S}=V(D) SV(D),S=V(D) \ S S S,且 v s ∈ S , v t ∈ S ‾ v_s\in S, v_t \in \overline{S} vsS,vtS,则称弧集 { ( v i , v j ) ∈ E ( D ) ∣ v i ∈ S , v j ∈ S ‾ } \{(v_i,v_j)\in E(D)|v_i \in S, v_j \in \overline{S}\} {(vi,vj)E(D)viS,vjS} 为容量网络 D D D 的截,记作 ( S , S ‾ ) (S,\overline{S}) (S,S)
截的容量 ∑ ( v i , v j ) ∈ ( S , S ‾ ) c i j \sum_{(v_i,v_j)\in(S,\overline{S})}c_{ij} (vi,vj)(S,S)cij,记作 c ( S , S ‾ ) c_(S,\overline{S}) c(S,S)
最小截:容量达最小的截为最小截。
定理:设 D D D 是一个容量网络,源为 v s v_s vs,汇为 v t v_t vt。设 f f f 是容量网络 D D D 的一个流, ( S , S ‾ ) (S,\overline{S}) (S,S) D D D 的一个截,则有 v a l ( f ) ≤ c ( S , S ‾ ) val(f) \leq c(S,\overline{S}) val(f)c(S,S)
证明:…
流值与截容量相等当且仅当每条弧都是饱和弧且无逆流的时候。
若容量网络的一个流 f f f 的流值等于某个截 ( S , S ‾ ) (S,\overline{S}) (S,S)的容量,即 c ( S , S ‾ ) = v a l ( f ) c(S,\overline{S})=val(f) c(S,S)=val(f),则 f f f 为最大流, ( S , S ‾ ) (S,\overline{S}) (S,S) 为最小截。


4.2 最大流算法

4.2.1 可增路

可增路:设 P P P 是一条 ( v s , v j ) (v_s,v_j) (vs,vj) 路,如果①对 P P P 中每条正向弧 ( v i , v j ) , f i j < c i j (v_i,v_j),f_{ij} < c_{ij} (vi,vj),fij<cij;②对 P P P 中每条反向弧 ( v i , v j ) , f i j > 0 (v_i,v_j),f_{ij} > 0 (vi,vj),fij>0,则称 ( v s , v j ) (v_s,v_j) (vs,vj) f f f 非饱和路;否则为饱和路。从源到汇的 f f f 非饱和路,称为 f f f 可增路。


4.2.2 最大流算法

定理:设容量网络 D D D 的源为 v s v_s vs,汇为 v t v_t vt f f f D D D 的一个流,则 f f f 为最大流当且仅当 D D D 中不存在 f f f 可增路。
证明:只需证明充分性。只需证明存在截 ( S , S ‾ ) (S,\overline{S}) (S,S) 满足: ( S , S ‾ ) (S,\overline{S}) (S,S) 中的每条弧都是饱和弧, ( S ‾ , S ) (\overline{S}, S) (S,S) 中的每条弧都是零弧。
将顶点分类,令 S = { v s } ∪ { v j ∣ 存在一条 f 非饱和路 ( v s , v j ) } S=\{v_s\} \cup \{v_j|存在一条 f 非饱和路 (v_s,v_j)\} S={vs}{vj存在一条f非饱和路(vs,vj)},故有 v t ∈ S ‾ v_t \in \overline{S} vtS
S S S S ‾ \overline S S 之间假设 f i j < c i j f_{ij} < c_{ij} fij<cij,易见 P + ( v i , v j ) P+(v_i,v_j) P+(vi,vj) 亦为 f f f 非饱和路,与 v j ∈ S ‾ v_j \in \overline{S} vjS 矛盾。同理可以证明 f i j = 0 f_{ij}=0 fij=0
标号法能求解可增路


4.2.3 最大流最小截定理

最大流算法结束时,最大流流值等于最小截容量。
定理:在任何容量网络 D D D 中,最大流的流值等于最小截的容量。
证明:(大致思路)设 S S S 为能用标号法能够获得标号的顶点集合,则 ( S , S ‾ ) (S,\overline{S}) (S,S) 之间的弧的值必定为 0 0 0


4.3 最小费用最大流

4.3.1 问题描述

f f f 的费用:设容量网络 D D D 的源为 v s v_s vs,汇为 v t v_t vt c i j c_{ij} cij b i j b_{ij} bij 分别表示弧 ( v i , v j ) (v_i,v_j) (vi,vj) 上的容量和单位流量费用,设 f f f G G G 的流,则称 b ( f ) = ∑ ( v i , v j ) ∈ E ( D ) f i j b i j b(f)=\sum_{(v_i,v_j)\in E(D)}f_{ij}b_{ij} b(f)=(vi,vj)E(D)fijbij 为流 f f f 的费用。在容量网络 D D D 的所有最大流中寻找费用最小的流,这样的流称为最小费用最大流。


4.3.2 F增广圈

增广圈:设 Q Q Q 是一个具有指定正向的圈, Q + Q^+ Q+ 为圈 Q Q Q 上正向弧的集合, Q − Q^- Q 为圈 Q Q Q 上反向弧的集合。

  1. δ i j = c i j − f i j , ( v i , v j ) ∈ Q + \delta_{ij}=c_{ij}-f_{ij},(v_i,v_j) \in Q^+ δij=cijfij(vi,vj)Q+
  2. δ i j = f i j , ( v i , v j ) ∈ Q − \delta_{ij}=f_{ij},(v_i,v_j) \in Q^- δij=fij(vi,vj)Q

δ ( Q ) = m i n { δ i j ∣ ( v i , v j ) ∈ E ( Q ) } \delta(Q)=min\{\delta_{ij}|(v_i,v_j) \in E(Q)\} δ(Q)=min{δij(vi,vj)E(Q)}
δ ( Q ) > 0 \delta(Q)>0 δ(Q)>0,则称 δ ( Q ) \delta(Q) δ(Q) 为允许修改流量,称圈 Q Q Q 为容量网络 D D D 上关于流 f f f增广圈
对于 f f f 增广圈 Q Q Q,我们可以定义 f ′ f' f

  1. f i j ′ = f i j + δ ( Q ) , ( v i , v j ) ∈ Q + f_{ij}^{'}=f_{ij} + \delta(Q),(v_i,v_j)\in Q^+ fij=fij+δ(Q)(vi,vj)Q+
  2. f i j ′ = f i j − δ ( Q ) , ( v i , v j ) ∈ Q − f_{ij}^{'}=f_{ij} - \delta(Q),(v_i,v_j)\in Q^- fij=fijδ(Q)(vi,vj)Q
  3. f i j , ( v i , v j ) ∉ E ( Q ) f_{ij},(v_i,v_j) \notin E(Q) fij(vi,vj)/E(Q)

这样 f ′ f' f 仍是 D D D 的流并且 v a l ( f ′ ) = v a l ( f ) val(f')=val(f) val(f)=val(f),称 f ′ f' f 为基于 f f f 增广圈 Q Q Q 的修正流。

负圈:设有容量网络 D D D f f f 是一个流, f i j , c i j , b i j f_{ij},c_{ij},b_{ij} fij,cij,bij 分别为弧 ( v i , v j ) (v_i,v_j) (vi,vj) 上的流量、容量和单位费用,设 Q Q Q 是关于流 f f f 的增广圈。称 b ( Q , f ) = ∑ ( v i , v j ) ∈ Q + b i j − ∑ ( v i , v j ) ∈ Q − b i j b(Q,f)=\sum_{(v_i,v_j)\in Q^+}b_{ij}-\sum_{(v_i,v_j)\in Q^-}b_{ij} b(Q,f)=(vi,vj)Q+bij(vi,vj)Qbij 为增广圈的费用,若小于 0 0 0,则称 Q Q Q 为负圈。负圈与流量、容量、费用、圈的指定方向有关。


4.3.3 Klein 算法

算法:

  1. 求容量网络 D D D 的一个最大流。
  2. 寻找网络中的负圈。若没有负圈,算法结束;若找到一个负圈,转step 3
  3. 修改负圈 Q Q Q 上各弧的流量,得到修正流。在新修正流的基础上,转step 2,继续寻找负圈。

定理:设有容量网络 D D D f f f 是一个流, f i j , c i j , b i j f_{ij},c_{ij},b_{ij} fij,cij,bij 分别为弧 ( v i , v j ) (v_i,v_j) (vi,vj) 上的流量、容量和单位费用,则 f f f 是最小费用最大流当且仅当任何 f f f 增广圈 Q Q Q 的费用 b ( Q , f ) ≥ 0 b(Q,f)\geq0 b(Q,f)0,即无负圈


你可能感兴趣的:(图论,笔记)