算法导论课堂笔记

第22章

22.1图的表示

邻接链表 空间需求:O(V+E)

邻接矩阵 空间需求:O(V^2)

22.2 广度优先搜索 BFS O(V+E)

Prim 最小生成树算法和 Dijkstra的单源最短路算法都使用了类似BFS的思想

算法过程:

​ 所有结点一开始均为白色,将起始点入队列。从队列中取点,遍历该点临接所有顶点,如果为白色则颜色置为灰色,然后入队列,遍历完后,该点颜色置为黑色。重复上述过程,直到队列为空。

所以队列中一直全是灰色结点

证明1:给定G=(V,E),G为一个有向图或无向图,经过BFS算法,初始点为s,对于任意u∈V,
u.d = min(s,u)。

引理22.1 存在边(u,v),则min(s,v)<= min(s,u)+1

证明:分2种情况,u是s可达和u是s不可达

引理22.2 v.d >= min(s,v)

引理22.3 BFS算法的队列Q中,假设Q中为:v1,v2,v3…vr, 则vr.d <= v1.d +1

vi+1.d <= vi+1.d

推论22.4*😗 vi先于vk入队,则 vi.d <= vk.d,先入队的距离小,一旦入队,d[]值就不发生 变化。

反证法。假设存在一些顶点,它们的d[]值不等于最短路径距离。设v是这些顶点中,最短路径距离最小的。(v ≠s),

d[v] >= d(s, v) (引理22.2),因此d[v] > d(s, v) 。vs之间 必然存在一条最短路径 s ->v ,否则 min(s-> v) =正无穷 。设u是这条最短路径上v的前驱,即s …-> u -> v。因此, d(s, v) = d(s, u) +1。这意味着d(s, u) < d(s, v) , 根据v的选择方式, d[u] =min(s->u)

d[v] > min(s->v) = min(s->u) +1= d[u] +1。

练习:

22.2-8 找到树的直径

方法1 求任意2点间的距离,最大的便是直径

方法2 利用2次BFS,从任意一点开始做bfs,找到离该点最远点u,再从u做BFS找到离u最远点v, u->v 便是直径

证明:

​ 只需证明 离任意点最远的点必然在直径上。

​ 从s出发做BFS,最远点为t

​ 分类讨论:① st与直径uv相交与一点h ②st与直径uv相交与一段hd ③ st与uv不相交

22.3 深度优先搜索DFS O(V+E)

每个结点初始颜色都是白色,在第一次被发现后变成灰色,当其邻接链表被扫描完成后变成黑色。

v.d是结点发现时间 v.f是结点搜索完成时间

颜色,祖先后代,区间

DFS forest:DFS creates a depth-first forest

(1)v是u的后代<=> d[v]时,u.color=gray

<=一个点灰色期间发现的点都是其后代

=>一个点是另外一个点的后代则是在那个点灰色期间被发现的

左边->右边 证明:

在DFS森林中存在一条u->x1->x2…xk->v的的路

xi是xi+1的前驱,π[xi+1]=xi

在执行DFS-visit(xi)时,调用了DFS-visit(xi+1)

在执行了DFS-visit(x0)时,调用了DFS-visit(x1)…调用了DFS-visit(xk-1)时候调用了DFS-visit(xk)

所以调用了DFS-visit(xk)时候,DFS-visit(x0)还没结束,则x0.color是灰色

同样的,u的颜色是灰色

左边<=右边 证明:已知,d[v]时刻,u是灰色的,则v是u的后代。

对u是灰色期间,调用的DFS-visit()的次数进行归纳

次数为1,设调用DFS-visit(w),则π[w]=u,w是u的后代

假设前k次调用DFS-visit[]的点都是u的后代,

当第k+1次调用DFS-visit[]时,调用为DFS-visit[s],则肯定存在点y,y是前k次调用中的某一个点,在进行DFS-visit[y]过程中调用了DFS-visit[s],则s是y的后代,又因为y是u的后代,所以s是u的后代

综上所诉,再调用DFS-visit(u),且DFS-visit(u)没结束时,所调用的DFS-visit(i)中的i都是u的后代

(2)括号定理,对图里任意两个点u,v,肯定是以下3种情况之一

1.u是v的祖先,d[u] < d[v] < f[v] <f[u]

2.v是u的祖先 d[v] < d[u] < f[u] <f[v]

3.u和v没关系 d[v]<f[v] <d[u]<f[u] or d[u]<f[u]<d[v]<f[v]

如上,可得任何两个点的时间不会交叉

证明:

对于情况1,u是v的祖先,所以d[v]时刻,u是灰色的,则d[u]<d[v]<f[u],

一旦v被发现了,只能等到v结束之后,才有可能从v退回到u,只有退回到u之后,才有可能结束u

故d[v]<f[v]<f[u], 所以d[u]<d[v]<f[v]<f[u]。

情况2,同情况1.

对于情况3,不妨设u先于v先发现,故d[u]<d[v],因为v不是u的后代,在d[v]时刻,u只能是黑色的,

所以f[u]<d[v],即d[u]<f[u]<d[v]<f[v]

综上,证明得证

推论:祖先区间严格包含后代

(3)白色路径定理

v是u的后代(结果) <=> d[u]时刻,u->v 存在白色路径(现象)

证明:

(=>) 已知v是u的后代,证明d[u]时刻,u->v 存在白色路径

v是u的后代,则存在u到v的路,在原图中,该路依然存在,

对于任意在这条路上的点w,w是u的后代,所以d[u]<d[w]<f[w]<f[u],所以d[u]时刻,w是白色的,

所以这条路是白色路径

(<=)已知d[u]时刻,u->v 存在白色路径,证明v是u的后代

反证:假设v不是u的后代

从u出发,沿u到v的路径检查每个点,设x是第一个不是u的后代的点,w是该路上x的前驱点,则w是u的后代或w就是u,d[u]<f[w]<=f[u] ,切存在边(w,x)

因为x不是u的后代,则d[u]<d[x]

又因为存在边(w,x),所以w不能在没发现x前结束,所以d[x]<f[w]

所以 d[u]<d[x]<f[w]<=f[u],

又由括号定理得 d[u]<d[x]<f[x]<f[u] ,x是u的后代,这与x不是u后代矛盾

故假设不成立,证明得证

对树边分类(根据 括号定理)

(1)树边:(π[v],u)

(2)返回边:后代->祖先

(3)前向边:祖先(非前驱)->后代

(4)交叉边:没有祖先后代关系的边(u,v) d[v]<f[v]<d[u]<f[u]

无向图只有树边和返回边 第一次用到的时候是什么类型就是什么边

证明:对任意边(u,v)∈E,不妨设d[u]<d[v]

① 第一次用(u,v)时,是从u->v,那d[u]时刻,v是白色,则v是u的后代,这条边是树边

否则,v是黑色,则(u,v)会在扫描v的时候扫描(u,v)边,v是灰色,则与u是v的祖先关系不符

②第一次用(u,v)时,是从v->u,d[v]时刻,u是灰色的,则v是u的后代,(u,v)是返回边

22.3-13 单连通图判断

当图经过DFS没有交叉变和前向边时候 便是单连通图

引理22.11 一个有向图是无环的,当且仅当它在DFS时,不会产生返回边

有环 <=> DFS时,有返回边

证明:

有环 => DFS时,有返回边:

设C=v1,v2,…,vk,v1是图中的一个环,

不妨设v1是环C上在DFS中最先发现的点,d[v1],时刻,存在一条v1到vk的白色路径,根据白色路径定理,vk是v1的后代,所以vk到v1的边就是返回边。

DFS时,有返回边 => 有环:

已知存在边(u,v)是一条返回边,则u是v的后代,则在DFS森林的某棵树上,存在一条v到u的路,又因为存在边(u,v),该路+(u,v)即构成了一个环。

综上,证明得证。

DAG:拓扑排序

进行DFS,然后对结束时间从大到小排序,结果就是一个拓扑序列

需求:任意(u,v)∈E,u前v后

需证明:对任意(u,v)∈E,f[u]>f[v]

算法: 结束时间,大在前,小在后

证明:由有向无环图的DFS不存在后向边克制,图中的边只有3种情况:

树边:d[u]<d[v]<f[v]<f[u]

前向边:d[u]<d[v]<f[v]<f[u]

交叉变:d[v]<f[v]<d[u]<f[u]

则对任意(u,v)∈E,f[u]>f[v]

Strongly Connected Components Decomposing SCC

(1)强连通,互相可达

(2)极大的

(3)默认自己能到达自己

对任意u,v∈V,u和v在同一个SCC中 <=> u和v在G转置中也同样属于一个SCC

引理:C1,C2是不同的SCC,u∈C1,v∈C2,存在边(u,v),则v到u不可达。

对于顶点集合U,d(U)=所有点中min(d(x)),f(U)=所有点中max(f(x))

引理:C,C‘ 是SCC,C!=C’ ,u∈C,v∈C‘,存在(u,v)∈E,则 f© > f(C’)。

证明:

(1)当d© < d(C’)

设x是C中最先发现的点,d[x]时刻,C和C’中除了x都是白色,且x到C和C‘中其他点都存在白色路径,所以C和C’中其他点都是x的后代, 所以f(C’)<f[x] = f©

(2)当d(C’) < d©

设y是C’中最先发现的点,d(C’)=d[y],d[y]时刻,C和C‘中除了y其他所有的点都是白色,y到C’中每个点都有白色路径,所以C‘中其他点都是y的后代,所以f(C’) = f[y],

又因为C和C’属于两个不同的强连通分支,u到v有边,则C中所有点都可到达y,所以y到C中任意一个点都没有路,从y开始做DFS,不可能到达C中的点,所以f[y]时刻,C中点都是白色的,所以f©>f[y]=f(C’)

综上,证明得证。

算法:任选一个顺序做DFS,求G^T,从f降序做DFS,结果便是强连通森林

在G中每次从剩下点中fmax的点开始做DFS,所以那个点所在的SCC没有出边,所形成的树一定是一个SCC。

定理 第二次DFS得到的每一棵树中的点恰好是一个SCC中的点:

SCC 中的每一个:C1,C2,C3…CN

第二次DFS得到的森林V1,V1…Vn

(1)每个SCC都在同一棵树上

(2)每棵树上不存在其他SCC中的点

证明:归纳假设

对于第一棵树,设结束时间最大的点为x1,第二次DFS的D[x1]时刻,x1所在的SCC记为Ct1,则此时

Ct1中所有的点除了x1以外都是白色的,且存在x1到这些点的白色路径,所以Ct1中的点初x1外,

都是x1的后代,所以他们都在x1为根的树中。对于任意点z∉Ct1,因为f(Ct1)是最大的,所以Ct1没有指向其他SCC的边,

则从x1到z是没有路的,所以x1的后代均是Ct1中的点,x1所在树不包含不在Ct1的点,所以x1所在树中点的集合等于Ct1

假设,前k棵树中的点都是k个SCC中的点,每一棵树对应一个SCC。

对于第k+1棵树,设根为X_k+1,X_k+1所在的SCC是Ctk+1.

第二次DFS的D[X_k+1]时刻,X_k+1到Ctk+1中每个点都有白色路径,所以Ctk+1中每个点都在X_k+1所在的树上。

因为X_k+1是剩下的点中结束时间最大的(根据归纳假设),则Ctk+1是剩下的SCC中结束时间最大的,则Ctk+1到其他剩下的SCC没有边,

则X_k+1开始做DFS不会搜到剩余的其他SCC中的点,也就是说X_k+1为根的树中仅包含Ctk+1中的点

22.5-7 证明图G是半连通的:任意2个点u,v u到v有边或者v到u有边

找出强连通分支的拓扑序列,相邻两点间有边

第23章Minimum Spanning Tree

Tree is an acyclic, connected graph.

A tree of |V| vertices has |V|-1 edges.

There exists a unique path between any two vertices of a tree.

Adding any edge to a tree creates a unique cycle. Breaking any edge on this cycle restores a tree.

Deleting any edge on a tree increases the number of connected components by 1

核心

割 (X,Y),X∪Y=V,X∩Y=∅,X≠∅,Y≠∅

如果存在一条边一个点在X中一个点在Y中,则这条边横跨切割(X,Y)

在横跨一个切割的所有边中,权重最小的边称为"轻量边".

集合中任意边不不横跨割,则割 尊敬 集合。

穿过割中权重最小的是轻边

A是MST的子集

定理23.1 cut(X,Y)尊敬A, (u,v)是穿过(X,Y)的轻边,(u,v)对A是安全的,A+(u,v) 还是MST_T的子集

证明:

(1) (u,v)∈T,

且A是T的子集,则A+(u,v) 还是MST_T的子集

(2) (u,v)∉T

在T中存在u到v的简单路

T+(u,v) 构成环

在该环上,至少存在的一个边(x,y),x∈X,y∈Y,

T’ = T+(u,v) -(x,y) 是一棵生成树

u(T’) <= u(T)+w(u,v)-w(x,y)

又因为T是MST,所以u(T’) = u(T)

所以T‘也是最小生成树

找到割,尊敬A。 找法:从A中拿出一个连通分支作为一边,其他连通分支作为一边 则,可找到尊敬A的割。

23.1-5 设e是连通图G某个环路上权重最大的边,证明存在一棵图G的MST不包含边e。

证明:

​ 反证,假设图G的每一个MST都包含边e,选一个MST T1,将e从T1中去掉,则T1变成2棵子树,已知e在某个环路中,则存在除e外另外一条边可连接2棵树,设为s,已知e在环路中权重最大,那么去掉e加上s后仍然是MST且,权重<=W(T1),所以假设不成立,证明成立。

Kruskal:排序,按权值从小到大开始取边,判断该边是否安全,安全则加入。

Prim:有一个key数组,π数组,key[i]为点i到目前创建的MST子集的最小边值,π数组存前向点,每次取不在集合中且key值最小的点加入子集,在更新key和π数组,直到所有点都在集合中

1.properties of MST (性质)

(1)(u,v)是E中权重最小的边,则存在MST T,(u,c)∈T。

证明:设A是MST的子集,cat(x,y)尊敬A,(u,v)是穿过(X,Y)的轻边

则A+{(u,v)} 还是一个MST的子集

令A=∅,则(u,V-u)尊敬A,(u,v)是穿过(u,V-u)的轻边,则A+{(u,v)} 还是一个MST的子集

思路2:反证法,假设(u,v)不存在任何一棵MST中,则任取一棵MST T,则T+(u,v)再去掉环中一边 还是生成树,且权值不变,所以还是一棵MST,且包含(u,v)与假设矛盾。。。。

(2)MST T,将T中边权值排序,w(e1)<= w(e2)…<=w(en-1),每棵MST的边权数组是一样的。

(3)MST T,将T中边权值排序,w(e1)<= w(e2)…<=w(en-1)

​ ST T‘ 将T’中每一条边排序 ,w(e1’)<=w(e2’)…<=w(en-1’)

任何一个位置上下方点都大于等于上方点。

证明:

(反证法)假设存在i,w(ei)>w(ei’),

不妨设i为最小的,且满足w(ei)>w(ei’。

w(e1)<= w(e2)…<=w(ei)…<=w(en-1)

w(e1’)<=w(e2’)…<=w(ei’)…<=w(en-1’)

则可得w(e1’)<=w(e2’)…w(ei’)<=w(ei)<w(ei+1)…<=w(en-1)

引理:将{e1’,e2’…ei’}中每一条边一次加入到T中,要么生成环,要是得到多重边(也可看成环)

则环上原本属于T的边属于{e1,e2…ei-1},加上的边一直是环上最大的,否则,用新加的边替换环上的一条比它大的边,

会得到一棵比T更小的生成树,与T是MST矛盾。

先将{ei,ei+1…en-1}从T中删除,则T变成有n-i+1的连通分支的森林。再将{e1‘,e2’,ei’}加入T。

对于任意ej’ ,1<=j<=i,ej’不会将两个连通分支连到一起(因为,ej’两个端点路上的边都来自e1,e2…ei-1这些边,它们都没被删)

即ej’两个端点都在同一个连通分支里。

设有边的连通分支为k个,C1…Ci=(Vs,Es)…Ck,

Es累加和为:i-1

Es‘累加和为:i

必存在l ,|El|<|El’|

又因为C是树,则|El|=|vi-1|

所以|Vi| <= |El’|,则总会构成环路,则这与{e1‘,e2’,ei’}都来自ST 不会有环路 矛盾。

根源:在T里面比ei小的边有i-1条,则T’里面有i条,所以w(ei)<=w(ei’)

2.Seocond-best MSF

第24 章 Single-Source Shortest Paths Problem

24.1 最短路的子路也是最短路

证明:反证法

前驱图 = 最短路径树

松弛(u,v,w)

if d[v] > d[u]+w(u,v)) ,

then d[v] = d[u] + w(u,v)), π[v] = u

BELLMAN-FORD算法 O(VE)

遍历|V|-1次,每次将遍历每条边,进行松弛

最后再遍历每条边 判断是否需要松弛,需要则 有负环

不需要则 求的结果就是最短路

三角不等式:(u,v)∈E,且最短路长度(s,v) <= 最短路长度(s,u)+w(u,v)

证明:

(1)u是s可达的,且s到u的最短路存在

从s出发,如果s->u的最短路存在,经过s到u的最短路到u,在通过(u,v)到v,是一条从s到v的普通路

所以 最短路长度(s,v) <= 最短路长度(s,u)+w(u,v)

(2)u是s不可达的:

最短路长度(s,v) = ∞

所以∞ <= ∞

(3)s到u可达,但最短路不存在

所以最短路长度(s,u) = -∞,最短路长度(s,v) = -∞

所以-∞ <= -∞

松弛性质:

1.上界:对任意v∈V,无论多少次松弛,d[v]>=最短路(s,v)

证明:对任意u属于V-{s},d[v]=正无穷>=最短路(s,v)

​ d[s] = 0 >= 最短路(s,v) (0 or -∞)

假设经过了k次relax之后,对任意v∈V,满足d[v]>=最短路(s,v)

需要证明:当经过k+1次relax后,对任意v∈V,满足d[v]>=最短路(s,v)

设第k+1次relax了(x,y),若relax无效,则所有点的d值都没变,对任意v∈V,满足d[v]>=最短路(s,v)

若relax有效,则d[y] = d[x] +w(x,y),其他点的d值没变,

所以d[y] = d[x] +(x,y) >= 最短路(s,x) +w(x,y) >=最短路(s,y) (根据三角不等式)

2.不可达性:s到v没有边,则d[v] = 最短路(s,v) = +∞

3.收敛性:一旦d[u]=最短路[s,u],一直会相等

4.在relax(u,v)之后的瞬间,d[v] <= d[u] + w(u,v)

之后如果π[v] =u,则 d[v] >= d[u] + w(u,v)

5.收敛性:s…u->v,是从s到v的最短路

在relax(u,v)这条边之前,d[u] = 最短路长度[s,u],

在relax(u,v)之后d[v] = 最短路长度[s,v]

证明:

​ 在relax(u,v)之后的瞬间,d[v] <= d[u] + w(u,v) = 最短路长度[s,u] + w(u,v) =最短路[s,v]

​ 之后如果π[v] =u,则 d[v] >= d[u] + w(u,v) = 最短路[s,v]

所以d[v] = 最短路长度[s,v]

子序列:从原来序列中找出一部分组成的序列

路径松弛性:

已知P<s,v0,v1,v2…,vp>是从s到vp的最短路

(v0,v1)(v1,v2)…(vk-1,vk)是relax边的序列

如果P是这个序列的子序列,则(vk-1,vk)结束之后

这个序列上每个点t,都满足d[t] = 最短路长度[s,t]

用归纳法证明:对任意1<=i<=k,在relax序列中,当做完relax(vi-1,vi)后

d[vi] = 最短路长度[s,vi]。

初始时,d[v0] = 最短路长度[s,v0] = 0

假设:d[vi-1] = 最短路长度[s,vi-1]

需证明:relax(vi-1,vi)之后,d[vi] = 最短路长度[s,vi]

因为<v0,v1,…vi-1,vi>是s到vi的最短路,因为d[vi-1] = 最短路长度[s,vi-1],

由收敛性可得relax(vi-1,vi)之后,d[vi] = 最短路长度[s,vi]

对于任意点v∈E,经过relax,使得d[v] = 最短路长度[v],

那么根据π得到的前驱图,便是最短路径树

需要满足三个条件:

(1)包含且仅包含s可达的点

(2)以s为根的树

(3)s到达每个点的唯一的路是最短路

(2)证明:G(V,E)不管做多少次Relax,前驱图都是以S为根的树,

思路:假设有环,松弛前没环,松弛后有环,不妨设为c<v0,v1,v2,…,vk,v0>,则对于环路c上每一个点而言

松弛条件都成立过

所以 vi.d>vi-1.d +w(vi-1,vi)

一个环路累计起来 该环路的权重合就小于0,则G中有负环

(3)证明:

要证明是最短路:最短路[s,u] <= 最短路[s,v] + w(v,u)

所以d[u] <= d[v] + w[v,u]

又因为d[u] >= d[v] + w[v,u]

所以d[u] = d[v] + w[v,u]

证明4-8行有效,

当有负环时,返回false

没有负环时,返回true

证明:

当没有负环时候,对于任意点v,d[v] = 最短路[s,v]

最短路[s,v] <= 最短路[s,u] + w(u,v)

d[v] = 最短路[s,v],d[u] = 最短路[s,u]

所以任意(u,v) ∈E,d[v] <= d[u] + w(u,v),所以不能被松弛,所以返回true

当有负环时,设C<v0,v1,…,vk=v0>是一个负环

假设(v0,v1),(v1,v2)…(vk-1,vk)都不能被松弛了

则d[vi] <= d[vi-1] + w[vi-1,vi],0<=i<=k-1

累加起来, 则 0 <= 负环权重和,不成立,所以假设不成立,则存在边(vm,vm+1)被松弛

则返回false

Dijkstraa’s Algorithm

problem solved

复杂度:O(ElogV)(最小堆)

定理24.6 当dijkstra算法结束的时候,对于任意v∈V,d[v] = 最短路(s,v)

证明:对于任意u∈V,当u被选中时,d[u] = 最短路(s,u)

反证:假设:存在一些点,such as u,当选中时,d[u] != 最短路(s,u)

设v是第一个被选中时,d[v] ≠ 最短路(s,v)

(1)v是s可达的,否则d[v] = 最短路(s,v) = ∞

(2)v不是原点,否则d[v] = 最短路(s,v) = 0

(3)综上,我们可以假设s…v是s到v的最短路,考虑v被选中前的一瞬间

在s到v的最短路上一定存在(x,y) x已经被选中,y还没被选中

所以d[x] = 最短路(s,x)

s…x->y是s到y的最短路

选中x之后,选其他点之前,会relax(x,y),根据收敛性,这时候d[y] = 最短路(s,y)

又因为选v的时候,d[v] <= d[y] = 最短路(s,y) <= 最短路(s,v)

所以d[v] <= 最短路(s,v),又因为d[v] >= 最短路(s,v)

所以 d[v] = 最短路(s,v)

线性规划:

xj-xi <= bk

w(xi,xj) = bk

第 25章 All Pairs Shortest Paths

1.动态规划

定义一些变量(其中一些取值已知,与目标有关)

找出变量间的递推关系

计算

lij (m) : i到j的 边数 <=m 的最短路的长度值

给定的邻接矩阵:W

L(1) = W

Lij(m) = min(1<=k<=n){Lik(m-1) + wkj}

Lij(2m) = min(1<=k<=n){Lik(m) + Lkj(m)}

运用快速幂:O(n3次方logn)

Floyd -Warshall algorithm O(n^3)

dij (k) —— 从i到j的中间点的编号 <= k 的最短路长度值

πij(k) —— 从i到j的中间点的编号 <= k 的最短路上j的前驱

已知dij(0) = W

求dij(n)

dij(k) = min {dij(k-1) , dik(k-1)+dkj(k-1)}

πij(k) = {πij(k-1) (if 1),πkj(k-1) (if 2) }

复杂度O(n³)

传递闭包:<a,b>∈E,<b,c>∈E,则<a,c>∈E

tij(k) ,表示从i到j的中间点编号<=k 的路是否存在

集合s(k):i到j存在中间点编号<=k的路

每个s(k)可以分成s1,s2,

s1:i到j存在路且中间点编号<=k-1

s2:i—k---j的路

s存在 <=>s1存在 or s2存在

s = tij(k) s1= tij(k-1) s2 = tik(k-1) & tkj(k-1)

so: tij(k) = tij(k-1) | (tik(k-1) & tkj(k-1))

复杂度:O(n³)

O(n)时间内DFS找灰度顶点 可以判断一个无向图是否有环,即判有无后向边。

在O(V²logV + VE) 复杂度下找到任意两点间的距离

首先,对于任意点u∈V,给一个数h(u)

对于w’(u,v) = w(u,v) + h(u) - h(v)

这样最短路的地位还是不变,同时图中若存在环路,环路的权重合不变

要保证w’(u,v) = w(u,v) + h(u) - h(v) >= 0

所以h(v) <= h(u) + w(u,v) 类似三角不等式

由此,可以给原图加一个新点S,S到每一个点都有一个距离为0的边

算S到每个点的距离 然后该距离作为h值,从而得到一组满足上式的h值

所以先运行Bellman-Ford 算法 ,在运行Dijkstra算法计算|V|次,

第26章 Maximum Flow Problem

最大流问题

流网络 有向加权图

起始点 原点 终点 汇点

边的权重称为容量

a->b c(a,b)=x,b->a,c(b,a)=y <=> a->b,c(a,b)=x,b->c,c(b,c)=y , c->a , c(c,a)=y <=任何一个方向上不能两个方向都有边

流网络中的一个流:f , V×V—> R

条件1:非负, 对于任意u,v , f(u,v) >= 0

条件2:容量约束,对于任意u,v ,f(u,v) <= c(u,v)

条件3: 流守恒,任意u∈V-{s,t} , ∑f(v,u) = ∑f(u,v)

|f| = ∑f(s,v) - ∑f(v,s)

FDRD-FULKERSON-METHOD(G,s,t)

initialize flow f to 0

while there exits an augmenting path p

​ do augment flow f along p

return f

f0,G -> Gfo 剩余网络

找一个流f0,去掉该流后,再找一个增广路P1,则有流f1,则f0和f1 可以合成为一个新流f0 ,循环上述操作,直到找不到增广路,则找到一个cut,利用最大流-最小割定理得到最大流

剩余容量cf(u,v):

c(u,v) - f(u,v) 当(u,v) ∈E

f(v,u) 当(v,u) ∈E

0,其他

剩余网络:剩余容量大于0的边集合

增广路p:剩余网络中s->t的路, cf§ = min{cf(u,v),(u,v)∈p}

则新流fp(u,v) = cf§,if(u,v) is on p

流的合成:f1 = f↑f’

f1(u,v) = f(u,v) +f’(u,v) - f’(v,u) if(u,v)∈E

当找不到增广路时,会存在cut(S,T),s在S中t在T中

cut的流:f(S,T) = ∑∑f(u,v) - ∑∑f(v,u) S->T - T->S

cut的容量:c(S,T) = ∑∑c(u,v) S->T

引理26.1 G=(V,E),源点s,汇点t,f为G中一个流,设Gf为f的剩余网络,f‘为Gf的一个流 则|f↑f’| = |f| + |f‘| ,也是一个流. p420

证明:如果(x,y)∈E,则Cf(y,x) = f(x,y)

①容量约束,若(u,v)∈E,(f|f’)(u,v) = f(u,v)+f’(u,v)-f’(v,u) <= f(u,v)+f’(u,v) <= f(u,v) + c(u,v)-f(u,v)<=c(u,v)

② 非负,(f↑f’)(u,v) = f(u,v) + f’(u,v) - f’(v,u) >= f(u,v) + f’(u,v) - f(u,v) = f’(u,v) >= 0

<=: (f↑f’)(u,v) = f(u,v) + f’(u,v) - f’(v,u) <= f(u,v) + f’(u,v) <= f(u,v) + cf(u,v) = f(u,v) + c(u,v) - f(u,v) = c(u,v)

③流守恒:对于任意u∈v-{s,t}有

∑(f↑f’)(u,v) = ∑(f(u,v) + f’(u,v) - f’(v,u))

= ∑f(u,v) + ∑f’(u,v) - ∑f’(v,u)

= ∑(f(v,u) + f’(v,u) - f’(u,v))

=∑(f↑f’(v,u))

引理26.4 设f为流网络G的一个流,该流网络的源结点为s,汇点为t,设(S,T)为G的任意切割,净流量f(S,T) = |f|

证明:通过流守恒来证明

引理26.5 任何一个流的大小都小于等于任意割的容量

定理26.6 最大流最小切割定理 以下3个条件等价 p423

1.f是最大流

2.找不到增广路

3.存在cut,c(S,T) = |f|

1=>2,求逆否,有增广路则存在更大的流:存在增广路p,cf§ = |f’| >0

|f↑f‘| = |f| + |f’| > |f|

​ 2=>3,在剩余网络中,让S = {s有路能到的点} ,T={s不可达的点},则cut(S,T)

c(S,T) = ∑∑c(u,v)

f(S,T) = ∑∑f(u,v) - ∑∑f(v,u)

则需满足对任意边(u,v),u∈S,v∈T,f(u,v) = c(u,v), 对任意边(v,u),u∈S,v∈T,f(u,v) = 0,流过去的都饱和,流回来的都没有

在原网络中,对任意(u,v)属于E,u∈S,v∈E,则(u,v)不在剩余网络中,所以cf(u,v)=c(u,v) - f(u,v) = 0 ,所以c(u,v) = f(u,v)

在原网络中,对任意(x,y)属于E,x∈T,y∈S,cf(y,x) = f(x,y),且(y,x)不在剩余网络中,则cf(y,x) = f(x,y) = 0

3=>1,最大流的大小要小于等于最小割的容量

Ford-Fulkerson Method 复杂度:O(E|f|)

二分图的最大匹配

匹配,最大匹配

构造成最大流问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzzzzzzq丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值