算法导论-----图论-----单源最短路径
单源最短路径
1.边权可以为时间、费用、罚款、损失或者任何其他沿一条路径线性积累的和我们试图将其
最小化的某个量
2.单源最短路径的变体:
(1)单终点最短路径问题:找出每个点到指定终点的最短路径
解决方法:把图中每条边反向,可转换为单源最短路径
(2)单对顶点最短路问题:对每个顶点u,v找出从u到v的最短路径
解决方法:从渐进意义看,目前没有比单源算法更快的算法解决这个问题
(3)每对顶点间的最短路径问题:下一节介绍
3.最短路径最优子结构
对任一带权有向图G=(V,E)所定义的权函数为w:E->R。设p=<v1,v2,…,vk>是从v1到vk的最短路径。对任意i,j其中1<=i<=j<=k,设pij=<vi,…,vj>为从顶点vi到vj的子路径。那么pij是从vi到vj的最短路
4.负值权变
若存在一条从s可达的负权回路,那么最短路径权的定义就不成立了
如果从s到v的某路径中存在一条负权回路就定义σ(u,v)=负无穷
Dijk输入边权必须为非负边
Bellman-ford可输入负边,只要不存在从源点可达的负权回路就能给出正确答案。若存在,则检查报错
5.一最短路径中不能包含负权回路也不能包含正权回路
可以从任一路径中移去0权回路
6.最短路径的表示
对每一顶点v都设置其前驱π(v)为另一顶点或者NIL
顶点集Vπ为G中所有具有非空前驱的顶点集合,再加上源点s
Vπ={v属于V:π(v)!=NIL}并{s}
有向边集Eπ是由Vπ中的顶点的π的值导出的边集
7.设图G=(V,E),是带权有向图,其加权函数为w:E->R,假定R中不包含s属于V的负权回路,那么最短路径是良定义的
8.松弛技术
对每个顶点v属于V都设置一个属性d[v]用来描述从s到v的最短路径的上界,称为最短路径估计
对最短路径估计和前趋进行初始化
INITIALIZE-SINGLE-SOURCE
For each vertex v属于 V[G]
do d[v]=负无穷
π[v]=NIL
d[s]=0
对u,v进行松弛操作
RELAX(u,v,w)
If d[v]>d[u]+w[u,v]
Then d[v]=d[u]+w[u,v]
π[v]=u
叫松弛的原因:设σ(s,u)=d[u],σ(s,v)=d[v]
所以满足约束d[v]<=d[u]+w(u,v)无压力,所以是松弛的
9.最短路及松弛的性质
三角不等式:对任意边(u,v)属于E,有σ(s,v)<=σ(s,u)+w(u,v)
上界定理:对任意顶点v属于V有d[v]>=σ(s,v),而且一旦达到σ(s,v)值就不再改变
无路径性质:s到v无路径,则d[v]=σ(s,v)=正无穷
收敛性质:s~u->v是图G某u,v的最短路径,而且在松弛边(u,v)之前的任何时间d[u]=σ(s,u),则在操作过后总有d[v]=σ(s,v)
路径松弛性质:任意s=v0到vk的最短路径p=<v0,v1,…,vk>按顺序进行松弛,(v0,v1),(v1,v2),…,(vk-1,vk),那么这些松弛以后以及在以后的任意时刻都有d[vk]=σ(s,vk)
无论其他边是否发生松弛,(包括与p的变交错的发生松弛),这一性质都保持
前趋子图性质:一旦对所有的v属于V ,d[v]=σ(s,v),前趋子图就是一个以s为根的有根树