首页 > 代码库 > 算法8-8:最短路径性质
算法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:最短路径性质
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。