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

yizhihongxing

下面是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大文件上传详解及实例代码

    Java大文件上传详解及实例代码 介绍 Java大文件上传是web开发中比较基础的功能,常用于图片、视频等大文件的上传。基于HTTP协议的限制,一般的文件上传有大小限制,一般为1M,甚至更小。本篇文章将介绍如何使用Java实现大文件上传,并提供示例代码。 实现方案 为了实现大文件上传功能,我们可以采用分片上传的策略,将大文件切分成多个片段进行上传。具体的实现…

    Java 2023年5月20日
    00
  • Java中的InterruptedException是什么?

    InterruptedException 是 Java 中的异常类,它主要发生在一个正在等待某个时间或资源的线程被其他线程中断时,用于通知该线程所等待的操作已经无法继续。本文将详细讲解 Java 中的 InterruptedException,包括其用法、常见场景和示例说明。 用法 InterruptedException 继承自 Exception 类,通…

    Java 2023年4月27日
    00
  • Java多线程之显示锁和内置锁总结详解

    Java多线程之显示锁和内置锁总结详解 前言 随着现代计算机的发展,CPU的速度和核心数量逐渐增加,让多线程编程变得越来越重要。Java作为一门支持多线程的语言,在多线程编程方面也提供了一系列的API和机制。本文将重点介绍Java中的两种锁:显示锁和内置锁,并对它们进行详细分析和对比。 什么是锁? 在多线程编程中,为了保证共享资源的正确访问,我们经常需要对这…

    Java 2023年5月19日
    00
  • java 数学计算的具体使用

    Java 数学计算的具体使用 在Java中,我们可以使用内置的Math类来进行数学运算。该类提供了许多静态方法,可以进行各种数学运算。本文将详细介绍Math类中提供的方法,并通过两个示例说明如何在Java中使用这些方法。 常用Math类方法 常量 Math类提供了两个数学常数: π(圆周率):Math.PI e(自然对数的底数):Math.E 基本运算 绝对…

    Java 2023年5月26日
    00
  • Java IO流 File类的常用API实例

    Java IO流 File类的常用API实例攻略 1. 什么是Java IO流 File类? Java IO流是Java核心API中的一部分,它提供了一种在Java应用程序中进行输入和输出操作的方式。File类是Java IO流中的重要类,它用于封装文件或目录的访问操作,提供了一系列对于文件或目录进行操作的方法。 2. File类的常用方法 2.1 File…

    Java 2023年5月19日
    00
  • java如何更改数据库中的数据

    想要更改数据库中的数据,需要使用Java中的数据库操作技术,以下是详细的步骤: 1. 准备工作 首先需要确保Java项目中已经引入了数据库操作相关的依赖,例如JDBC。其次需要配置数据库连接信息,包括数据库驱动、数据库地址、用户名和密码等。 2. 连接数据库 使用Java代码连接数据库,可以使用JDBC提供的java.sql.Connection接口。例如:…

    Java 2023年5月19日
    00
  • 通用弹出层页面(兼容IE、firefox)可关闭控制宽高及屏蔽背景

    为了让大家更好地理解,我将会详细讲解如何实现“通用弹出层页面(兼容IE、firefox)可关闭控制宽高及屏蔽背景”。 1. 确定需求 首先,我们需要确定所需的样式和功能。需求如下: 弹出层需要兼容IE和firefox浏览器 弹出层需要能够控制宽度和高度 弹出层需要能够屏蔽背景 弹出层需要提供关闭按钮 2. 编写HTML代码 然后,我们需要在HTML文件中编写…

    Java 2023年6月15日
    00
  • Windows下使用Graalvm将Springboot应用编译成exe大大提高启动和运行效率(推荐)

    下面我将详细讲解“Windows下使用Graalvm将Springboot应用编译成exe大大提高启动和运行效率(推荐)”的完整攻略。 1. 确认Graalvm是否已安装 首先需要确认Graalvm是否已经安装在本地。如果还没有安装,可以去官网下载并安装。 2. 确认Springboot应用是否可用 接下来需要确认Springboot应用是否可用,可以通过在…

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