最短路径
最小生成树是以无向带权图为基准,而最短路径则是以加权有向图为基准
最短路径树
- 给定一幅加权有向图和一个顶点s。
- 以s为起点的一棵最短路径树是图的一幅子图,它包含s和从s可达的所有顶点。
- 根节点为s,到叶子结点的每条路径和都是有向图中的一条最短路径
基本数据结构:
public class DirectedEdge {
// 定义的是起始节点,互相不一定互通
private final int v;
private final int w;
private final double weight;
public DirectedEdge(int v, int w, double weight) {
this.v = v;
this.w = w;
this.weight = weight;
}
public double weight(){
return weight;
}
public int from(){
return v;
}
public int to(){
return w;
}
}
public class EdgeWeightedDigraph {
// 通过始点来记录边
private final int V;
private int E;
private Bag<DirectedEdge>[] adj;
public EdgeWeightedDigraph(int V) {
this.V = V;
this.E = 0;
adj = (Bag<DirectedEdge>[]) new Bag[V];
for (int v = 0; v < V; v++) {
adj[v] = new Bag<>();
}
}
public int V() {
return V;
}
public int E() {
return E;
}
public void addEdge(DirectedEdge e){
adj[e.from()].add(e);
E++;
}
public Iterable<DirectedEdge> adj(int v){
return adj[v];
}
public Iterable<DirectedEdge> edges(){
Bag<DirectedEdge> bag = new Bag<>();
for (int v = 0; v < V; v++) {
for (DirectedEdge edge : adj[v]) {
bag.add(edge);
}
}
return bag;
}
}
数据结构记录:
-
最短路径树中的边:edgeTo[],edgeTo[v]的值为树中连接v和它的父节点的边(也是从s到v的最后一条边)
-
到达起点的距离。distTo[],其中distTo[],为从s到v的已知最短路径的长度
-
边的松弛:
- 检查从s→w的最短路径是否先从s→v,然后再由v→w
- 检查distTo[v]与e.weight()的和,如果这个值不小于distTo[w],则称这条边失效了,并将它忽略
- 如果这个值更小,就更新内容
private void relax(DirectedEdge e){
int v = e.from(),

本文总结了最短路径的相关算法,包括Dijkstra算法、无环加权有向图的最短路径算法以及Bellman-Ford算法。Dijkstra算法适用于无负权边的图,而Bellman-Ford算法能处理存在负权边的情况,防止负权环导致的最短路径问题。
最低0.47元/天 解锁文章
1633

被折叠的 条评论
为什么被折叠?



