两种经典的单源最短路径算法图解与java实现(贪心Dijkstra和A*)

本文探讨了单源最短路径问题中的Dijkstra算法和A*算法,详细解析了这两种贪心搜索方法的思路。Dijkstra算法通过优先队列找到最短路径,而A*算法结合启发式函数f(n)=g(n)+h(n),在效率和精度间取得平衡。文章还介绍了两者在Java实现中的关键差异。
摘要由CSDN通过智能技术生成

单源最短路径典型的启发式搜索有两种,分别是贪婪最佳优先搜索(Greedy best-first search)和A*寻路搜索。这篇文章以最短路径问题为例来展开讨论两种搜索方法的思路。

First Step:确定路径的存储结构

可求最短路径的结构往往是有向带权图,用代码表示就是

public class Graph {
    // 有向有权图的邻接表表示
  private LinkedList<Edge> adj[]; // 邻接表
  private int v; // 顶点个数
  public Graph(int v) {
   
    this.v = v;
    this.adj = new LinkedList[v];
    for (int i = 0; i < v; ++i) {
   
      this.adj[i] = new LinkedList<>();
    }
  }
  public void addEdge(int s, int t, int w) {
    // 添加一条边
    this.adj[s].add(new Edge(s, t, w));
  }
  private class Edge {
   
    public int sid; // 边的起始顶点编号
    public int tid; // 边的终止顶点编号
    public int w; // 权重
    public Edge(int sid, int tid, int w) {
   
      this.sid = sid;  this.tid = tid;  this.w = w;
    }
  }
  //这个类是为了dijkstra实现用的
  private class Vertex {
   
    public int id; // 顶点编号ID
    public int dist; // 从起始顶点到这个顶点的距离
    public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值