java实现dijkstra最短路径寻路算法

下面是Java实现Dijkstra最短路径寻路算法的完整攻略:

什么是Dijkstra最短路径寻路算法

Dijkstra算法是一种可以求解带权重图(有向或无向)中的最短路径的算法。该算法要求图的权重为非负值。

Dijkstra算法实现思路

  • 首先我们需要初始化:所有点的到起点的距离为无穷大,但起点到自己的距离为0。
  • 然后从起点开始,将起点标记为已访问过,并将其到与其相邻的点的距离记录下来。
  • 在所有相邻的点中选取距离最小的点,标记为已访问,并更新其与其相邻的点的距离。
  • 依次将与起点相邻的点标记为已访问,并更新它们与起点的距离,直到找到终点。

可以使用优先队列来实现上述思路,因为它可以按照距离大小进行排序。

Java程序示例

以下是一份简单的Java程序实现Dijkstra算法,该示例基于邻接矩阵来存储图:

import java.util.*;

public class DijkstraShortestPath {
    /** 邻接矩阵实现图 */
    private int graph[][];

    public DijkstraShortestPath(int[][] graph) {
        this.graph = graph;
    }

    /** Dijkstra实现方法 */
    public int[] dijkstra(int start) {
        // 将所有点的距离都初始化为无穷大
        int[] dist = new int[graph.length];
        Arrays.fill(dist, Integer.MAX_VALUE);
        // 将起点到自己的距离定为0
        dist[start] = 0;

        // 使用优先队列实现
        PriorityQueue<Node> priorityQueue = new PriorityQueue<>();
        priorityQueue.offer(new Node(start, 0));

        while (!priorityQueue.isEmpty()) {
            Node node = priorityQueue.poll();
            int current = node.getValue();
            // 如果该点已经被访问过,无需再次访问
            if (node.getCost() != dist[current]) {
                continue;
            }

            // 更新neighbor的距离
            for (int next = 0; next < graph.length; next++) {
                int cost = graph[current][next];
                if (cost == Integer.MAX_VALUE) {
                    continue;
                }
                int distance = dist[current] + cost;
                if (dist[next] > distance) {
                    dist[next] = distance;
                    priorityQueue.offer(new Node(next, distance));
                }
            }
        }
        return dist;
    }

    /** 优先队列中存储的信息 */
    public class Node implements Comparable<Node>{
        int value;
        int cost;
        public Node(int value, int cost) {
            this.value = value;
            this.cost = cost;
        }

        public int getValue() {
            return value;
        }

        public int getCost() {
            return cost;
        }

        @Override
        public int compareTo(Node o) {
            return Integer.compare(this.cost, o.cost);
        }
    }

    public static void main(String[] args) {
        int[][] graph = {
                { 0, 2, 3, 4, Integer.MAX_VALUE },
                { 2, 0, Integer.MAX_VALUE, Integer.MAX_VALUE, 6 },
                { 3, Integer.MAX_VALUE, 0, 3, 1 },
                { 4, Integer.MAX_VALUE, 3, 0, 5 },
                { Integer.MAX_VALUE, 6, 1, 5, 0 }
        };
        DijkstraShortestPath dijkstra = new DijkstraShortestPath(graph);
        int[] dist = dijkstra.dijkstra(0);
        System.out.println(Arrays.toString(dist));  // [0, 2, 3, 4, 5]
    }
}

在上述代码中,我们定义了一个邻接矩阵类型的图并实现了Dijkstra算法以计算从起点0到其余所有节点的最短距离(上述的邻接矩阵数组就是该图的数据结构)。

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

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

相关文章

  • Java lambda表达式与泛型整理总结

    本文主要介绍Java lambda表达式与泛型的相关概念,包括基本语法、使用场景和示例。使用Markdown语法进行排版,方便阅读。 Java lambda表达式 基本语法 Lambda表达式是JDK 1.8中引入的新特性,简化了编写匿名内部类的过程。其基本语法如下: (parameters) -> expression 或 (parameters) …

    Java 2023年5月26日
    00
  • springboot与springmvc基础入门讲解

    让我来为您详细讲解“springboot与springmvc基础入门讲解”的完整攻略。 简介 Spring Boot是Spring Framework的一个扩展框架,它为Spring开发者提供了更快的开发体验。Spring MVC是一个经典的MVC框架,负责接收HTTP请求并将其转换为相应的处理程序,通常由Controller和Model组成。 本文将对Sp…

    Java 2023年5月15日
    00
  • Java对文件进行基本操作案例讲解

    当需要对文件进行基本操作时,Java提供了一系列的类和方法来实现对文件的读写和管理,这些类主要包括:File类、FileReader类、FileWriter类、BufferedReader类和BufferedWriter类等。下面将详细讲解如何在Java中对文件进行基本的操作。 创建文件 在Java中创建新的文件我们需要用到File类的createNewFi…

    Java 2023年5月20日
    00
  • springboot整合spring-data-redis遇到的坑

    下面是Spring Boot整合Spring Data Redis的详细攻略,包括常见的坑和解决方法。 准备工作 首先,确保电脑中安装有Redis服务,并启动了Redis服务。然后在Spring Boot项目中添加以下依赖: <dependencies> <dependency> <groupId>org.springfr…

    Java 2023年5月20日
    00
  • 详解SpringBoot中使用JPA作为数据持久化框架

    下面为您详细讲解SpringBoot中使用JPA作为数据持久化框架的完整攻略。 1. JPA简介 JPA(Java Persistence API)是JavaEE标准的ORM(对象关系映射)规范,它提供了一种简化了的操作数据库的方式,将Java对象映射到关系型数据库,实现Java程序与数据库的隔离。JPA的实现包括Hibernate、EclipseLink等…

    Java 2023年5月20日
    00
  • 初识Spring Boot框架之Spring Boot的自动配置

    让我来为你详细讲解“初识SpringBoot框架之SpringBoot的自动配置”的完整攻略。 什么是SpringBoot自动配置 SpringBoot自动配置是SpringBoot框架的一大特性,其目的是让开发者更便捷地进行项目开发和配置。SpringBoot根据项目中所依赖的组件(例如:数据源、web),自动为整个项目进行一些常见的配置,而无需开发者手动…

    Java 2023年5月15日
    00
  • java8 LocalDate 使用详解

    Java8 LocalDate 使用详解 什么是LocalDate LocalDate是Java8中用于处理日期的类,它能表示一个ISO-8601标准的日期(如2019-03-29)。相比于Java中旧的日期类(如Date和Calendar)而言,LocalDate有着更好的易用性、更加清晰的语义和更强大的功能。 基本用法 创建LocalDate 使用静态方…

    Java 2023年5月20日
    00
  • Java调用SQL脚本执行常用的方法示例

    Java调用SQL脚本执行常用的方法示例有很多种,下面我分别给出两种示例和详细攻略。 示例一 需求描述 我们需要在Java应用中执行一些SQL脚本文件,以便初始化数据库。这些脚本文件需要在应用启动时执行,只需要执行一次。 实现步骤 将SQL脚本文件包含在Java应用的classpath中,例如存放在/src/main/resources/sql目录下。 使用…

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