📜  带有路径打印的 Dijkstra 算法的Java程序(1)

📅  最后修改于: 2023-12-03 14:54:06.642000             🧑  作者: Mango

带有路径打印的 Dijkstra 算法的Java程序

算法简介

Dijkstra 算法是一种用于解决带权有向图中单源最短路径问题的贪心算法。该算法通过确定起始顶点到其余顶点的最短路径来实现其目标。Dijkstra 算法是广泛使用的最短路径算法,被用于路由协议和其他网络、交通和通讯领域。

当需要输出最短路径时,Dijkstra 算法需要通过路径打印来实现。路径打印是指输出最短路径上的所有顶点,以确定路径。

实现过程

Dijkstra 算法的实现步骤如下:

  1. 创建一个数组 dist[],用于存储从起始顶点到其他顶点的最短距离,初始值为无穷大。
  2. 将起始顶点到自身的最短距离设置为 0,即 dist[start] = 0
  3. 创建一个布尔数组 visited[],用于标记每个顶点是否被访问过,初始值为 false
  4. 将起始顶点的路径添加到路径列表中,即 path.add(start)
  5. 遍历整个图,找出距离起始顶点最近的顶点 currentVertex,并将 visited[currentVertex] 设置为 true
  6. 对于未被访问的顶点 v,如果 dist[v] > dist[currentVertex] + weight(currentVertex, v),则更新 dist[v] 的值,并将 prev[v] 设为 currentVertex
  7. 找到下一个距离起始顶点最短的顶点,重复步骤 5 和 6 直到所有顶点都被访问过。
  8. 最后,通过倒叙输出 prev[] 数组中的路径来打印出最短路径。
代码实现

以下是带有路径打印的 Dijkstra 算法的 Java 代码片段:

import java.util.ArrayList;
import java.util.List;

public class Dijkstra {

    public List<Integer> getShortestPath(int[][] graph, int start, int end) {
        int[] dist = new int[graph.length];
        int[] prev = new int[graph.length];
        boolean[] visited = new boolean[graph.length];

        for (int i = 0; i < graph.length; i++) {
            dist[i] = Integer.MAX_VALUE;
            prev[i] = -1;
            visited[i] = false;
        }

        dist[start] = 0;

        for (int i = 0; i < graph.length; i++) {
            int u = minDistance(dist, visited);
            visited[u] = true;
            for (int v = 0; v < graph.length; v++) {
                if (!visited[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {
                    dist[v] = dist[u] + graph[u][v];
                    prev[v] = u;
                }
            }
        }

        List<Integer> path = new ArrayList<Integer>();
        int currentVertex = end;
        while (currentVertex != -1) {
            path.add(currentVertex);
            currentVertex = prev[currentVertex];
        }

        return path;
    }

    private int minDistance(int[] dist, boolean[] visited) {
        int min = Integer.MAX_VALUE;
        int minIndex = -1;
        for (int v = 0; v < dist.length; v++) {
            if (!visited[v] && dist[v] <= min) {
                min = dist[v];
                minIndex = v;
            }
        }
        return minIndex;
    }
}
结论

通过以上实现,我们可以成功地用 Java 代码实现带有路径打印的 Dijkstra 算法。算法的核心是使用最优子结构的思想,利用贪心算法不断选取距离起始顶点最近的顶点,然后更新其他未访问过的顶点的最短路径。路径打印使得我们可以通过算法计算的最短路径来输出具体的路径信息,便于我们理解算法并进行后续操作。