Java实现Dijkstra算法222
Dijkstra算法是一种贪心算法,用于寻找带权图中源点到所有其他顶点的最短路径。该算法由Edsger W. Dijkstra于1956年提出,广泛应用于网络路由、物流配送和图像分割等领域。
Dijkstra算法的工作原理如下:
初始化一个距离数组,将源点到自身的最短距离设为0,其他顶点设为无穷大。
创建已访问顶点的集合,初始为空。
重复以下步骤,直到所有顶点都被访问:
从未访问的顶点中找到距离源点最短的顶点。
将该顶点标记为已访问。
更新该顶点相邻顶点的距离,如果新路径比原路径更短,则更新距离。
以下是用Java实现的Dijkstra算法代码:```java
import .*;
public class Dijkstra {
private Map graph;
private int[] distances;
private Set settled;
private PriorityQueue pq;
private int source;
public Dijkstra(Map graph, int source) {
= graph;
= new int[()];
= new HashSet();
= new PriorityQueue((Node::getDistance));
= source;
for (int i = 0; i < ; i++) {
distances[i] = Integer.MAX_VALUE;
}
distances[source] = 0;
(new Node(source, 0));
}
public void execute() {
while (!()) {
Node current = ();
(());
for (Edge edge : ((), ())) {
int distance = distances[()] + ();
if (distance < distances[()]) {
distances[()] = distance;
(new Node((), distance));
}
}
}
}
public int[] getDistances() {
return distances;
}
private class Node {
private int vertex;
private int distance;
public Node(int vertex, int distance) {
= vertex;
= distance;
}
public int getVertex() {
return vertex;
}
public int getDistance() {
return distance;
}
}
private class Edge {
private int destination;
private int weight;
public Edge(int destination, int weight) {
= destination;
= weight;
}
public int getDestination() {
return destination;
}
public int getWeight() {
return weight;
}
}
}
```
使用示例:```java
Map graph = new HashMap();
(0, (new Edge(1, 4), new Edge(2, 8)));
(1, (new Edge(2, 11)));
(2, (new Edge(3, 7), new Edge(4, 2)));
(3, (new Edge(4, 9)));
(4, ());
Dijkstra dijkstra = new Dijkstra(graph, 0);
();
int[] distances = ();
for (int i = 0; i < ; i++) {
("距离源点到顶点" + i + "的最短路径长度:" + distances[i]);
}
```
输出结果:```
距离源点到顶点0的最短路径长度:0
距离源点到顶点1的最短路径长度:4
距离源点到顶点2的最短路径长度:7
距离源点到顶点3的最短路径长度:16
距离源点到顶点4的最短路径长度:9
```
2024-11-24
Java方法栈日志的艺术:从错误定位到性能优化的深度指南
https://www.shuihudhg.cn/133725.html
PHP 获取本机端口的全面指南:实践与技巧
https://www.shuihudhg.cn/133724.html
Python内置函数:从核心原理到高级应用,精通Python编程的基石
https://www.shuihudhg.cn/133723.html
Java Stream转数组:从基础到高级,掌握高性能数据转换的艺术
https://www.shuihudhg.cn/133722.html
深入解析:基于Java数组构建简易ATM机系统,从原理到代码实践
https://www.shuihudhg.cn/133721.html
热门文章
Java中数组赋值的全面指南
https://www.shuihudhg.cn/207.html
JavaScript 与 Java:二者有何异同?
https://www.shuihudhg.cn/6764.html
判断 Java 字符串中是否包含特定子字符串
https://www.shuihudhg.cn/3551.html
Java 字符串的切割:分而治之
https://www.shuihudhg.cn/6220.html
Java 输入代码:全面指南
https://www.shuihudhg.cn/1064.html