《算法导论》第24章 单源最短路径

来源:互联网 发布:美术网络培训有用吗 编辑:程序博客网 时间:2024/05/23 05:07

单元最短路径问题

单源最短路径问题,试图解决从一个原点到图中其他所有点的最短路径问题。此问题的变体有单终点最短路径问题,单终点最短路径问题和每对顶点间最短路径问题。可以相应理解为一对多、多对一、一对一和多对多的映射关系。

负权值边和负权回路

某些权值可以是负的,这些边称为是负权值边。负权回路指的是构成整个回路各边的权值和为负。

若不存在负权回路,只有负权值边,那么最短路径的定义依然正确;若存在负权回路,那么源点到回路上的任意一点都不存在最短路径,即此时最短路径无定义。

对于Dijkstra算法,要求所有的边都是正值。对于Bellman-Ford算法,则允许存在负权值边,但是不能够有负权回路。不过,就算存在,B-F算法也可以检测出来。

最短路径的表示

最短路径可以用最短路径树来表示,它类似于广度优先树。对每个点都会设置一个前驱(predecessor)。最短路径树并不是唯一的,对于一个顶点,存在两条权值相同的路径时,会相应产生不同的最短路径树。

松弛技术

这个专业名词乍看起来很难理解,其实很简单。就是从源点到任意一个顶点v的最短距离,即最短路径的权值,初始化为正无穷大,然后通过一次次的迭代,慢慢逼近。Bellman-Ford算法中,要对每条边执行多次松弛操作。Dijkstra算法中,要对每条边执行一次松弛操作。

伪代码如下:

RELAX(u, v, w)    if d[v] > d[u] + w(u, v)        then d[u] = d[u] + w(u, v)        previous[v] = u
0 0
原创粉丝点击