单源最短路径(算法导论24章)

来源:互联网 发布:手机excel软件下载 编辑:程序博客网 时间:2024/05/20 05:55

最短路径算法通常依赖最短路径的一个重要性质:两个结点之间的最短路径包含其他的最短路径。

最优子结构(动态规划和贪心算法指标):最短路径的子路径也是最短路径。

初始化操作(v.π=NIL,s.d=0,除s外v.d=):

INITIALIZE-SINGLE-SOURCE(G,s)     for each vertex v∈G.V            v.d=∞            v.π=NIL     s.d=0

对边(u,v)松弛操作(将s到u之间的最短距离加上w(u,v),并与当前s到v的最短距离比较更新):

RELAX(u,v,w)    if v.d>u.d+w(u,v)    v.d=u.d+w(u,v)    v.π=u

Bellman-Ford算法(贝尔曼-福特算法)反复松弛:

BELLMAN-FORD(G,w,s)    INITIALIZE-SINGLE-SOURCE(G,s)    for i=1 to |G.V|-1           for each edge∈G.E                                RELAX(u,v,w)for each edge(u,v)∈G.E       if v.d>u.d+w(u,v)             return FALSEreturn TRUE

Dijkstra算法(迪杰斯特拉算法):

在算法的运行过程中维持一组结点集合S。从源结点s到该集合中每个结点之间的最短路径都已经被找到。从V-S集合中选择最短路径估计最小的结点u,将u加入S,然后对所有从u发出的边进行松弛。我们使用一个最小优先队列Q来保存结点集合,每个节点的关键值为其d值。

DIJKSTRA.(G,w,s)   INITIALIZE-SINGLE-SOURCE(G,s)   S=∅   Q=G.V   while Q≠∅        u=EXTRACT-MIN(Q)        S=S{u}        for each vertex v∈G.Adj[u]            RELAX(u,v,w)


0 0