Java实现Dijkstra算法

71 篇文章 ¥59.90 ¥99.00
本文介绍了如何在Java中实现Dijkstra算法,该算法用于在加权有向图中找到最短路径。通过定义图类,使用优先队列和邻接表来存储和更新节点信息,逐步求解最短路径。示例代码展示了创建图、添加边以及调用Dijkstra方法求解最短路径的过程。

Java实现Dijkstra算法

Dijkstra算法是一种在加权有向图中寻找最短路径的常用算法。它的主要思想是通过不断更新起始节点到其他节点的距离值,逐步找到最短路径。

首先,我们需要定义一个图的类来表示加权有向图。该类包含顶点和边的信息。顶点可以用一个整数编号来表示,边则由起始顶点、目标顶点和权重值组成。

以下是一个简单的图类的实现:

import java.util.*;

class Graph {
   
   
    private int V
Dijkstra算法是一种经典的贪心算法,用于解决单源最短路径问题。其核心思想是通过逐步扩展最短路径集合,找到图中从起点到其他所有节点的最短路径。该算法适用于边权值为非负数的图结构,能够高效地求解最短路径问题[^1]。 以下是一个使用Java实现Dijkstra算法的示例代码,采用邻接表表示图,并使用优先队列优化选取当前距离最小的节点: ```java import java.util.*; class Graph { private int V; // 顶点数量 private List<List<Node>> adjList; static class Node { int vertex, weight; Node(int vertex, int weight) { this.vertex = vertex; this.weight = weight; } } Graph(int V) { this.V = V; adjList = new ArrayList<>(); for (int i = 0; i < V; i++) { adjList.add(new ArrayList<>()); } } void addEdge(int u, int v, int w) { adjList.get(u).add(new Node(v, w)); adjList.get(v).add(new Node(u, w)); // 如果是无向图 } void dijkstra(int start) { int[] dist = new int[V]; Arrays.fill(dist, Integer.MAX_VALUE); dist[start] = 0; PriorityQueue<Node> pq = new PriorityQueue<>((a, b) -> a.weight - b.weight); pq.add(new Node(start, 0)); while (!pq.isEmpty()) { Node current = pq.poll(); int u = current.vertex; int currentDist = current.weight; if (currentDist > dist[u]) continue; for (Node neighbor : adjList.get(u)) { int v = neighbor.vertex; int weight = neighbor.weight; if (dist[v] > dist[u] + weight) { dist[v] = dist[u] + weight; pq.add(new Node(v, dist[v])); } } } System.out.println("最短路径距离:"); for (int i = 0; i < V; i++) { System.out.println("顶点 " + start + " 到顶点 " + i + " 的最短距离为 " + dist[i]); } } } public class DijkstraExample { public static void main(String[] args) { Graph graph = new Graph(6); graph.addEdge(0, 1, 2); graph.addEdge(0, 2, 4); graph.addEdge(1, 2, 1); graph.addEdge(1, 3, 7); graph.addEdge(2, 4, 3); graph.addEdge(3, 4, 2); graph.addEdge(3, 5, 6); graph.addEdge(4, 5, 5); graph.dijkstra(0); } } ``` 上述代码中,`Graph`类用于表示图结构,`dijkstra`方法实现Dijkstra算法的核心逻辑。通过优先队列(`PriorityQueue`)来维护当前未处理节点中距离最小的节点,确保每次扩展的路径都是当前最短的。该算法的时间复杂度为 $O(E \log V)$,其中 $E$ 是边的数量,$V$ 是顶点数量,适用于稀疏图[^3]。 需要注意的是,由于Dijkstra算法依赖于每次选取当前最短路径的节点并将其标记为已处理,因此在存在负权边的情况下,该算法可能会产生错误的结果。负权边可能导致某些节点的最短路径在算法执行后期被进一步优化,但由于这些节点已经被处理,它们的距离值不会被重新计算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值