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日

相关文章

  • Spring JDBC的使用详解

    下面我来介绍一下Spring JDBC的使用详解攻略。 前置条件 在使用Spring JDBC之前,需要保证以下条件得到满足: 首先需要添加Spring JDBC相关的依赖包,如spring-jdbc。 在应用程序的配置文件中,需要配置数据源。这里以MySQL数据源为例,配置好数据源的连接信息,并在配置文件中声明数据源的bean。 Spring JDBC的基…

    Java 2023年5月20日
    00
  • MyBatis入门实例教程之创建一个简单的程序

    首先我们需要明确一下MyBatis的基础知识。MyBatis是一个持久层框架,可以与关系型数据库进行交互。在使用MyBatis时,我们需要进行以下三步操作: 配置数据源:需要在MyBatis的配置文件中配置数据库的连接信息。 编写Mapper文件:Mapper文件是MyBatis的核心,用于描述SQL语句以及与Java对象之间的映射关系。 执行SQL语句:通…

    Java 2023年5月20日
    00
  • Java服务器主机信息监控工具类的示例代码

    下面是Java服务器主机信息监控工具类的示例代码的完整攻略: 1.需求分析 我们需要编写一款可以监控Java服务器主机信息的工具类。在使用这个工具类时,我们希望能够: 获取系统CPU、内存的使用情况; 获取系统硬盘的使用情况; 获取系统网络带宽的使用情况。 2.技术选型 我们可以选择使用Java中的一些相关API实现这个功能,如: Runtime和Manag…

    Java 2023年5月30日
    00
  • Java上转型和下转型对象

    Java中的转型(Type Casting)包括上转型和下转型两种类型。上转型是指将子类对象赋值给一个父类类型的变量,而下转型则是指将父类类型的变量转换为子类类型的变量。本文将详细介绍Java上转型和下转型对象的完整攻略。 Java上转型 什么是Java上转型 Java上转型是指将一个子类对象赋值给一个父类类型的变量。转型后,父类类型的变量只能访问子类对象中…

    Java 2023年5月26日
    00
  • SpringMVC 数据校验方法(必看篇)

    以下是关于“SpringMVC 数据校验方法(必看篇)”的完整攻略,其中包含两个示例。 SpringMVC 数据校验方法 SpringMVC 数据校验是一种用于验证表单数据的机制。在本文中,我们将讲解SpringMVC 数据校验的实现原理及用法。 数据校验实现原理 SpringMVC 数据校验的实现原理是通过使用JSR-303规范中的注解来实现的。JSR-3…

    Java 2023年5月17日
    00
  • Nginx 连接tomcat时会话粘性问题分析及解决方法

    Nginx 连接tomcat时会话粘性问题分析及解决方法 问题背景 在使用 Nginx 对 Tomcat 进行反向代理时,如果不做任何特殊处理,有可能出现会话粘性问题,即同一个用户的请求被转发到了不同的 Tomcat 实例上,导致会话信息丢失,从而导致用户操作失败。 问题分析 会话粘性问题的根本原因是访问服务器时没有考虑到会话信息,导致同一用户的请求在多个服…

    Java 2023年6月16日
    00
  • 使用maven实现有关Jsoup简单爬虫的步骤

    下面是使用maven实现有关Jsoup简单爬虫的步骤的完整攻略。 1. 添加依赖 首先,在你的maven项目中,需要添加Jsoup的依赖。在pom.xml文件中,加入以下代码: <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</art…

    Java 2023年6月15日
    00
  • SpringBoot2.x中management.security.enabled=false无效的解决

    问题描述: 在使用 Spring Boot 2.x 项目时,当添加了 Actuator 组件后,如果需要关闭 Actuator 组件的安全认证功能,通过在配置文件中加入 management.security.enabled=false 进行了配置,但是访问 Actuator 的端点时,仍然需要输入用户名和密码进行认证。 解决方法: Spring Boot …

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