第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) 。v和s之间 必然存在一条最短路径 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|)
二分图的最大匹配
匹配,最大匹配
构造成最大流问题