zoukankan      html  css  js  c++  java
  • 算法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算法,适合无负环图

  • 相关阅读:
    js事件分类
    过3s弹出广告条,点叉号关闭
    js进阶
    js入门
    html
    R Markdown + Infinite Moon Reader + 编辑实时更新
    png转ico+windows图标+GIMP
    微生物+计算细胞倍增时间
    使用Mathjax网页插入公式
    Firefox+zoom+全局缩放比例
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6914403.html
Copyright © 2011-2022 走看看