java实现Dijkstra最短路径算法

下面是“java实现Dijkstra最短路径算法”的详细攻略:

什么是Dijkstra最短路径算法

Dijkstra最短路径算法是一种基于图的贪心算法,用于求解从一个出发点到其它节点的最短路径。算法适用于有向或无向加权图。

算法思路

  1. 初始化,将起点到各个节点的距离全部初始化为无穷大,将起点到自己的距离设置为0。
  2. 选取起点,将其设置为当前未处理节点中距离起点最短的节点。
  3. 以选取的节点为中心点,更新所有与之相邻的节点的距离。具体方法是将中心点到起点的距离加上中心点到相邻节点的距离,如果大于相邻节点当前距离,则将其距离更新为目前计算得到的更小值。
  4. 将当前节点标记为已处理的节点,当所有节点都被标记后,算法结束。

Java实现

import java.util.*;

public class DijkstraAlgorithm {
    private int numOfVertices;
    private int[] distance;
    private boolean[] visited;
    private int[][] adjacencyMatrix;

    public DijkstraAlgorithm(int numOfVertices) {
        this.numOfVertices = numOfVertices;
        distance = new int[numOfVertices];
        visited = new boolean[numOfVertices];
        adjacencyMatrix = new int[numOfVertices][numOfVertices];
    }

    public void dijkstra(int[][] graph, int source) {
        // 初始化distance数组
        for (int i = 0; i < numOfVertices; i++) {
            distance[i] = Integer.MAX_VALUE;
            visited[i] = false;
        }

        // 起点到起点的距离为0
        distance[source] = 0;

        for (int i = 1; i < numOfVertices; i++) {
            // 选取距离最小并且未被访问过的节点
            int u = getMinDistanceVertex(distance, visited);

            visited[u] = true;

            for (int v = 0; v < numOfVertices; v++) {
                if (graph[u][v] != 0 && !visited[v] && distance[u] != Integer.MAX_VALUE &&
                        distance[u] + graph[u][v] < distance[v]) {
                    distance[v] = distance[u] + graph[u][v];
                }
            }
        }

        // 输出到每个节点的最短距离
        for (int i = 0; i < distance.length; i++) {
            System.out.println("从源节点到" + i + "的最短距离是:" + distance[i]);
        }
    }

    private int getMinDistanceVertex(int[] distance, boolean[] visited) {
        int minDistanceVertex = -1;
        for (int i = 0; i < numOfVertices; i++) {
            if (!visited[i] && (minDistanceVertex == -1 || distance[i] < distance[minDistanceVertex])) {
                minDistanceVertex = i;
            }
        }
        return minDistanceVertex;
    }

    // 示例
    public static void main(String[] args) {
        int[][] graph1 = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
                          {4, 0, 8, 0, 0, 0, 0, 11, 0},
                          {0, 8, 0, 7, 0, 4, 0, 0, 2},
                          {0, 0, 7, 0, 9, 14, 0, 0, 0},
                          {0, 0, 0, 9, 0, 10, 0, 0, 0},
                          {0, 0, 4, 14, 10, 0, 2, 0, 0},
                          {0, 0, 0, 0, 0, 2, 0, 1, 6},
                          {8, 11, 0, 0, 0, 0, 1, 0, 7},
                          {0, 0, 2, 0, 0, 0, 6, 7, 0}};

        int[][] graph2 = {{0, 10, 15, 5},
                          {0, 0, 0, 20},
                          {0, 0, 0, 0},
                          {0, 0, 0, 0}};

        DijkstraAlgorithm dijkstra1 = new DijkstraAlgorithm(graph1.length);
        DijkstraAlgorithm dijkstra2 = new DijkstraAlgorithm(graph2.length);

        dijkstra1.dijkstra(graph1, 0);
        dijkstra2.dijkstra(graph2, 0);
    }
}

以上代码中,我们首先定义了四个成员变量:numOfVertices表示节点数量,distance表示源节点到各个节点的距离,visited表示该节点是否被处理过,adjacencyMatrix表示各个节点之间的距离矩阵。

然后定义了DijkstraAlgorithm类的构造函数,用于初始化成员变量。

接着实现了dijkstra方法,其中需要明确处理流程,具体有上面算法步骤中所述。

最后我们定义了两个示例图,分别为graph1和graph2,其中graph1是经典的测试用例,用于测试该算法的正确性;graph2是一个较小的图例,用于示范输入矩阵的格式。

运行结果如下:

从源节点到0的最短距离是:0
从源节点到1的最短距离是:4
从源节点到2的最短距离是:12
从源节点到3的最短距离是:19
从源节点到4的最短距离是:21
从源节点到5的最短距离是:11
从源节点到6的最短距离是:9
从源节点到7的最短距离是:8
从源节点到8的最短距离是:14

从源节点到0的最短距离是:0
从源节点到1的最短距离是:10
从源节点到2的最短距离是:15
从源节点到3的最短距离是:5

从结果中可以看出,Dijkstra算法的实现是正确的,而且输出结果也符合预期。

总的来说,Dijkstra最短路径算法是一个常用的图论算法,非常适合求解从一个出发点到其它节点的最短路径问题。以上就是Java实现Dijkstra最短路径算法的全部攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现Dijkstra最短路径算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • javaScript 连接打印机,打印小票的实例

    要实现 JavaScript 连接打印机,打印小票的功能,可以借助 JavaScript 打印插件JSPrintManager。 JSPrintManager 是一个完全跨平台和打印技术无关的 JavaScript 打印客户端(打印机驱动程序),可通过扩展 Web 端点管理打印机及其设置,生成和打印 ZPL、EPL、ESC/POS、HTML、PDF、PNG、…

    Java 2023年6月15日
    00
  • Java开发之request对象常用方法整理

    Java开发之request对象常用方法整理 在Java web开发中,request对象是比较重要的一个对象,它代表了客户端发送的HTTP请求。本文将整理出request对象在开发过程中常用的方法。 获取请求参数 request对象可以通过如下方法来获取请求参数: String getParameter(String name) //获取单个参数值 Str…

    Java 2023年5月26日
    00
  • Java中JDBC连接数据库详解

    Java中JDBC连接数据库详解 JDBC是Java Database Connectivity的缩写,可以用于连接不同类型的数据库(如MySQL、Oracle等),并进行数据库操作。本篇文章将详细讲解如何在Java中使用JDBC连接数据库。 步骤1:加载JDBC驱动 在使用JDBC连接数据库之前,需要加载相应的数据库驱动。例如,如果要连接MySQL数据库,…

    Java 2023年5月19日
    00
  • 常见的JVM参数有哪些?

    当我们运行Java程序时,JVM参数可以通过命令行传入,用于控制程序的行为和性能。下面介绍一些常用的JVM参数及其用法。 JVM参数列表 以下为常见的JVM参数列表: -Xmx: 设置Java堆内存的最大值 -Xms: 设置Java堆内存的初始值 -Xss: 设置线程栈的大小 -XX:PermSize: 设置永久代的初始值 -XX:MaxPermSize: …

    Java 2023年5月10日
    00
  • 如何解决多线程安全问题?

    以下是关于如何解决多线程安全问题的完整使用攻略: 如何解决多线程安全问题? 在多线程编程中,为了避免多个线程同时访问共享导致的数据不一致、程序崩溃等问题,需要取相应的措施来解决多线程安全问题。以下是一些常的解决方法: 1. 使用锁机制 锁机制是一种常用的解决多线程安全问题的方法。在多线环境下,使用锁机制可以保证同一时间只有一个线程可以访问共享,从而避免了数据…

    Java 2023年5月12日
    00
  • 一文带你轻松应对Springboot面试小结

    一、简介 该攻略主要介绍了如何应对Spring Boot面试中常见的问题,并详细解答了每一个问题。通过学习该攻略,可以更好地了解和掌握Spring Boot的相关知识,增加面试成功的概率。 二、Spring Boot常见问题 什么是Spring Boot? Spring Boot是一个基于Spring框架的开发的Web框架,它通过自动化配置提供了一种快速构建…

    Java 2023年5月15日
    00
  • SpringBoot整合Shiro的代码详解

    接下来我会详细讲解“SpringBoot整合Shiro的代码详解”的完整攻略。整个过程分为以下几个步骤: 添加依赖 配置Shiro 编写身份认证和授权逻辑 添加Web接口 测试 下面我会一一解释每个步骤的具体内容。 1. 添加依赖 首先需要在pom.xml文件中添加Shiro和SpringBoot的依赖: <dependency> <gro…

    Java 2023年6月15日
    00
  • Java BigDecimal除法精度和格式化输出方式

    下面为你详细讲解Java BigDecimal除法精度和格式化输出方式的完整攻略。 BigDecimal的除法精度 在使用BigDecimal进行除法运算时,需要确保除数不为0,并且设置正确的精度,否则将会导致运算结果不准确。下面是两个示例说明。 示例1 假设有两个数a=1.23456789和b=2,我们需要将a除以b并保留4位小数。代码如下: BigDec…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部