最短路径:学习总结

本文总结了最短路径的相关算法,包括Dijkstra算法、无环加权有向图的最短路径算法以及Bellman-Ford算法。Dijkstra算法适用于无负权边的图,而Bellman-Ford算法能处理存在负权边的情况,防止负权环导致的最短路径问题。
摘要由CSDN通过智能技术生成

最短路径

最小生成树是以无向带权图为基准,而最短路径则是以加权有向图为基准

最短路径树

  • 给定一幅加权有向图和一个顶点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(),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值