Dijkstra算法以及Java实现

5 篇文章 0 订阅
1 篇文章 0 订阅

(1)Dijkstra算法简介

Dijkstra算法是典型的用来求最短路径的算法,主要用来计算有向图中从起始点到其他所有点的最短路径.该算法采用贪心的思想,每次都查找与起始点距离最近的点,并将结果输出.该算法的主要特点是每次迭代的时候选择的下一个顶点是标记点之外距离源点最近的顶点.一般情况下,该算不能用来解决存在负权边的图。

(2)Dijkstra算法的设计思想

s为源,w[u,v] 为点uv 之间的边的长度,结果保存在 dist[]。
初始化:源的距离dist[s]设为0,其他的点距离设为无穷大,同时把所有的点状态设为没有扩展过。
循环n-1次:
    ① 在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩展。
    ② 对于每个与u相邻的点v,如果dist[u] + w[u,v] < dist[v],那 
    么把dist[v]更新成更短的距离dist[u] + w[u,v]。此时到点v的最短 
    路径上,前一个节点即为u。
    ③结束:此时对于任意的udist[u]就是su的距离。

由于上边的说法太过形式化难以理解,所以给大家写了个小例子,如下:

(3)Dijkstra算法的具体步骤
这里写图片描述
如图所示,假设A点为源节点,目的是要计算从A点到其余所有点的最短路径。具体执行步骤如下表所示:
这里写图片描述
这里写图片描述

(4)Dijkstra算法的结果测试分析

1. 计算核心节点A到有向图其余节点的最短路径信息,按顺序输出。
2. 计算出核心节点A到其余节点的最短距离sum,按顺序输。
3. 计算出核心节点A到其余节点的最短路径sum之和,即sumend,并输出。
4. 遍历有向图中所有节点,按顺序做和A一样的操作。

这里写图片描述

1.分别计算出有向图中所有节点到其余节点的最短距离之和
2.如下图,A到其余所有节点最短距离之和为29,B到其余所有节点最短距离之和为34,等等。
3.将这些最短距离之和进行比较,得出最小值。

这里写图片描述
这就是整个Dijkstra算法的过程,具体代码详见楼主下篇博客,主要讲解代码部分(java实现)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法是一种用于寻找图中两点之间最短路径的贪心算法,通常用于解决单源最短路径问题。在Java实现Dijkstra算法,你可以按照以下步骤进行: 1. 初始化:创建一个优先队列(通常使用`PriorityQueue`或自定义最小堆),存储顶点和它们的距离(初始时距离为无穷大,源节点距离为0)。 2. 创建邻接表或邻接矩阵表示图。 3. 主循环: a. 从队列中取出当前最短距离的节点。 b. 更新与其相邻节点的距离,如果通过当前节点到达更短,更新距离,并标记该节点已访问。 c. 将未访问的邻居节点加入队列。 4. 当队列为空或找到目标节点时,算法结束。此时队列中的最后一个元素即为目标节点,且所有节点的距离值即是最短路径。 以下是简单的Java代码实现: ```java import java.util.*; public class Dijkstra { private final int V; // 图的顶点数 private List<List<Edge>> adj; // 邻接列表 private int[] dist; // 存储每个节点到源的距离 // 边类,包含起点、终点和权重 class Edge implements Comparable<Edge> { int src, dest, weight; public Edge(int src, int dest, int weight) { this.src = src; this.dest = dest; this.weight = weight; } @Override public int compareTo(Edge other) { return Integer.compare(this.weight, other.weight); } } public Dijkstra(int v, List<List<Edge>> adj) { this.V = v; this.adj = adj; dist = new int[V]; Arrays.fill(dist, Integer.MAX_VALUE); dist = 0; } // Dijkstra算法核心部分 public void dijkstra() { PriorityQueue<Edge> pq = new PriorityQueue<>(); pq.add(new Edge(0, 0, 0)); // 元素为 (距离, 节点, 来源) while (!pq.isEmpty()) { Edge curr = pq.poll(); int u = curr.dest; // 当前节点 if (dist[u] < curr.weight) continue; // 已经找到更短路径,跳过 for (Edge e : adj.get(u)) { int v = e.dest, alt = dist[u] + e.weight; if (alt < dist[v]) { dist[v] = alt; pq.removeIf(edge -> edge.src == v); // 如果找到更短路径,移除旧路径 pq.offer(new Edge(v, alt, u)); // 添加新路径 } } } } // 返回源节点到所有其他节点的最短距离 public int[] printDistances() { return dist; } // 示例用法 public static void main(String[] args) { List<List<Edge>> adj = new ArrayList<>(); // 图的邻接列表构建 // 填充邻接列表... Dijkstra dijkstraAlg = new Dijkstra(V, adj); dijkstraAlg.dijkstra(); int[] shortestDist = dijkstraAlg.printDistances(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值