java编程实现dijkstra算法
时间: 2023-05-31 19:18:47 浏览: 97
### 回答1:
Dijkstra算法是一种用于寻找图中最短路径的算法。它的基本思想是从起点开始,不断扩展到距离起点最近的节点,直到到达终点为止。在扩展的过程中,需要记录每个节点到起点的距离和路径。具体实现时,可以使用优先队列来维护距离最小的节点。
以下是Java实现Dijkstra算法的代码示例:
```java
import java.util.*;
public class Dijkstra {
private int n; // 节点数
private int[][] graph; // 图的邻接矩阵表示
private int[] dist; // 起点到各个节点的距离
private boolean[] visited; // 是否已经访问过
private int[] prev; // 记录最短路径中每个节点的前一个节点
public Dijkstra(int[][] graph) {
this.n = graph.length;
this.graph = graph;
this.dist = new int[n];
this.visited = new boolean[n];
this.prev = new int[n];
}
public void dijkstra(int start) {
// 初始化
Arrays.fill(dist, Integer.MAX_VALUE);
Arrays.fill(visited, false);
Arrays.fill(prev, -1);
dist[start] = ;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.offer(new Node(start, ));
while (!pq.isEmpty()) {
Node node = pq.poll();
int u = node.u;
if (visited[u]) continue;
visited[u] = true;
for (int v = ; v < n; v++) {
if (graph[u][v] > && !visited[v]) {
int newDist = dist[u] + graph[u][v];
if (newDist < dist[v]) {
dist[v] = newDist;
prev[v] = u;
pq.offer(new Node(v, newDist));
}
}
}
}
}
public List<Integer> getPath(int end) {
List<Integer> path = new ArrayList<>();
for (int u = end; u != -1; u = prev[u]) {
path.add(u);
}
Collections.reverse(path);
return path;
}
private static class Node implements Comparable<Node> {
int u;
int dist;
public Node(int u, int dist) {
this.u = u;
this.dist = dist;
}
@Override
public int compareTo(Node o) {
return Integer.compare(dist, o.dist);
}
}
}
```
使用示例:
```java
int[][] graph = {
{, 2, 4, , },
{2, , 1, 4, 2},
{4, 1, , 3, },
{, 4, 3, , 2},
{, 2, , 2, }
};
Dijkstra dijkstra = new Dijkstra(graph);
dijkstra.dijkstra();
System.out.println(dijkstra.getPath(4)); // [, 1, 4]
```
### 回答2:
Dijkstra算法是一种用于寻找基于赋权图的最短路径的算法,它的效率高且迅速。Java编程实现Dijkstra算法可以通过以下步骤实现:
1. 首先,创建一个Graph类来表示我们的赋权图。该类需要维护一个顶点集合,并提供以下方法:
- 添加一个节点
- 添加一条边
- 获取与给定节点相连的所有节点
- 获取给定节点到其他节点的距离
2. 创建一个PriorityQueue类型的队列,并将起点加入队列中。因为该算法需要使用到优先队列,所以我们需要先导入java.util.PriorityQueue类。
3. 为每个节点创建一个距离数组,将第一个节点的距离设置为0,并将其他节点设置为无穷大。
4. 创建一个HashMap来存储我们计算出的最短路径的前驱节点,键为目标节点,值为起点到该目标节点的前一个节点。
5. 在while循环中,取出距离数组最小的节点,在该节点的邻居中查找距离最短的节点,并更新该节点的距离。
6. 在更新每个节点的距离之后,将该节点添加到队列中,并将它的前驱节点存储在HashMap中。
7. 直到队列为空为止。在结束while循环后,我们就可以从起点到达任何其他节点,并可以使用HashMap回溯求出最短路径。
在Java编程中实现Dijkstra算法需要注意以下几点:
1. 为了处理没有连接的节点,我们需要将不存在的边距离设置为无穷大。
2. 我们可以使用Java提供的PriorityQueue类来实现优先队列。在PriorityQueue中,每个元素都有一个优先级,元素按照其优先级顺序进行排序。
3. 我们可以使用Double.POSITIVE_INFINITY来表示节点之间的无限距离。
4. 在使用HashMap时,我们需要注意将键值对加入HashMap的顺序,以确保每个键值对都正确地对应。
综上所述,Java编程实现Dijkstra算法需要细心和耐心。通过以上步骤和注意事项,我们可以灵活有效地应用Dijkstra算法,成功地解决基于赋权图的最短路径问题。
### 回答3:
Dijkstra算法是一种经典的贪心算法,用于求解加权图中的单源最短路径。Java语言是一门广泛使用的编程语言,也可以用于实现Dijkstra算法。
Dijkstra算法的实现步骤如下:
1. 初始化两个数组:一个记录从起点到每个节点的已知最短路径长度,另一个记录每个节点的前驱节点。
2. 起点的最短路径长度为0,前驱节点为空。
3. 选取与起点相邻的所有节点,并将它们的最短路径长度设为边权值,并将前驱节点设置为起点。
4. 从未确定最短路径的节点中,选取最小的一个节点,将其标记为已确定最短路径,并将它的相邻节点更新最短路径长度和前驱节点。
5. 重复第4步,直到所有节点都被标记为已确定最短路径或不存在从起点到终点的路径为止。
以下是Java实现Dijkstra算法的代码:
```
import java.util.*;
public class Dijkstra {
public static void main(String[] args) {
int vertices = 5;
int[][] graph = new int[][]{
{0, 6, 3, 0, 0},
{6, 0, 2, 5, 4},
{3, 2, 0, 3, 0},
{0, 5, 3, 0, 2},
{0, 4, 0, 2, 0}
};
int[] dist = new int[vertices];
boolean[] visited = new boolean[vertices];
PriorityQueue<Node> pq = new PriorityQueue<Node>(vertices, new Node());
for (int i = 0; i < vertices; i++) {
dist[i] = Integer.MAX_VALUE;
visited[i] = false;
}
dist[0] = 0;
pq.add(new Node(0, dist[0]));
while (!pq.isEmpty()) {
int u = pq.poll().node;
visited[u] = true;
for (int v = 0; v < vertices; v++) {
if (graph[u][v] != 0 && !visited[v]) {
int weight = graph[u][v];
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
pq.add(new Node(v, dist[v]));
}
}
}
}
System.out.println("最短路径长度:" + dist[vertices-1]);
}
static class Node implements Comparator<Node> {
public int node;
public int cost;
public Node() {}
public Node(int node, int cost) {
this.node = node;
this.cost = cost;
}
public int compare(Node node1, Node node2) {
if (node1.cost < node2.cost) {
return -1;
}
if (node1.cost > node2.cost) {
return 1;
}
return 0;
}
}
}
```
以上代码利用优先队列实现了Dijkstra算法,最终输出起点到终点的最短路径长度。通过Java语言编程实现Dijkstra算法,可以很方便地求解最短路径问题,并且Java语言也具备比较好的可读性和可维护性。