算法8-8:最短路径性质

Posted gavanwanggw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法8-8:最短路径性质相关的知识,希望对你有一定的参考价值。

在计算最短路径之前,往往会先计算最短路径树。也就是计算从一个顶点出发,到其余全部顶点的最短距离。


有了最短路径树之后。路径和距离就很easy实现了:

public double distTo(int v) {
    return distTo[v];
}
 
public Iterable<DirectedEdge> pathTo(int v) {
    Stack<DirectedEdge> result = new Stack<DirectedEdge>();
    DirectedEdge edge = edgeTo[v];
    while (edge != null) {
        result.add(edge);
        edge = edgeTo[edge.from()];
    }
    return result;
}


“放松”操作


在最短路径算法中须要一种操作,这样的操作称之为“放松”操作。目标就是让权重更小的边替代当前已知的最小边。它的代码实现例如以下:

private void relax(DirectedEdge edge) {
    int v = edge.from();
    int w = edge.to();
    if(distTo[w] > distTo[v] + edge.weight()) {
        distTo[w] = distTo[v] + edge.weight();
        edgeTo[w] = edge;
    }
}


实现方法


最主要的实现方法就是“放松”全部的边,得到一个最短路径树。


那么依照哪种顺序放松全部的边呢?这里有这些方法:

  • Dijkstra算法,适合非负权图

  • 拓扑排序算法。适合无环图

  • Bennman-Form算法,适合无负环图

以上是关于算法8-8:最短路径性质的主要内容,如果未能解决你的问题,请参考以下文章

详解图(性质,结构,遍历,最小生成树,最短路径)

详解图(性质,结构,遍历,最小生成树,最短路径)

修改广度优先搜索算法以记住矩阵中的最短路径

最短路径问题-Dijkstra(基于图的ADT)

单源最短路径算法

图--06---加权有向图最短路径Dijstra算法