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日

相关文章

  • 把普通对象转换成json格式的对象的简单实例

    下面是将普通对象转换成JSON格式对象的简单攻略: 准备工作 要将一个普通的对象转换成JSON格式对象,我们需要先引入JSON库(如在浏览器中使用,可以使用内置的JSON对象),然后再使用其中的方法将对象转换成JSON格式对象。 示例1 首先,我们定义一个普通对象: const obj = { name: "张三", age: 18, g…

    Java 2023年5月26日
    00
  • spring boot 使用Mybatis-plus查询方法解析

    Spring Boot使用Mybatis-Plus查询方法解析 Mybatis-Plus简介 Mybatis-Plus是一个Mybatis的增强工具,在Mybatis的基础上扩展了一些实用的功能,例如分页、逻辑删除、自动填充等。 配置Mybatis-Plus 在Spring Boot项目中使用Mybatis-Plus需要先配置相关依赖,可以在pom.xml文…

    Java 2023年5月20日
    00
  • Sprint Boot @JsonTypeInfo使用方法详解

    @JsonTypeInfo是Spring Boot中的一个注解,用于在序列化和反序列化Java对象时,指定类型信息。在本文中,我们将详细介绍@JsonTypeInfo注解的作用和使用方法,并提供两个示例。 @JsonTypeInfo注解的作用 @JsonTypeInfo注解用于在序列化和反序列化Java对象时,指定类型信息。当使用@JsonTypeInfo注…

    Java 2023年5月5日
    00
  • 在dos窗口中编译和运行java文件的方法

    在 DOS 窗口编译和运行 Java 文件的方法可以包含以下步骤: 检查 Java 路径:在 DOS 窗口中,输入命令 java -version,检查 Java 是否已经正确安装,以及 Java 的路径是否已经添加到系统环境变量中。 编写 Java 代码:使用文本编辑器,编写 Java 代码,并将其保存为后缀为 .java 的文件,例如 Hello.jav…

    Java 2023年5月23日
    00
  • Java虚拟机JVM性能优化(一):JVM知识总结

    在进行Java虚拟机JVM性能优化前,我们需要全面了解JVM的相关知识,这篇文章将对JVM进行总结,从而帮助我们提高程序性能。 JVM的定义及作用 JVM是Java虚拟机的缩写,它是Java程序能够在不同平台上运行的基础。JVM通过将Java字节码解释成平台相关的机器语言来实现这一功能,从而使Java程序能够在不同的操作系统上都能正常运行。 JVM架构 JV…

    Java 2023年5月19日
    00
  • Java 如何利用缓冲流读写文件

    Java 可以通过缓冲流来读写文件,缓冲流会将 I/O 操作的数据缓存起来,通过缓存操作可以减少访问磁盘次数,进而提升程序的性能。下面是利用缓冲流读写文件的步骤: 创建输入流对象。首先需要创建一个文件输入流对象(FileInputStream),再把它作为参数传给缓冲输入流(BufferedInputStream)的构造方法,从而创建一个缓冲输入流对象(例如…

    Java 2023年5月19日
    00
  • 基于Spring-Security自定义登陆错误提示信息

    基于Spring-Security自定义登陆错误提示信息的完整攻略如下: 第一步:添加Spring-Security依赖 我们需要在Maven或者Gradle项目中添加Spring-Security依赖,在pom.xml或build.gradle中添加相应的依赖配置,例如: <dependency> <groupId>org.spri…

    Java 2023年5月20日
    00
  • JavaScript设计模式之责任链模式实例分析

    以下是“JavaScript设计模式之责任链模式实例分析”完整攻略。 标题 JavaScript设计模式之责任链模式实例分析 简介 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它用于将请求沿着处理程序链进行传递,直到其中一个处理程序能够处理该请求。该模式允许多个对象处理请求,而不必相互引用,并且请求发送者和…

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