Java实现Dijkstra算法的示例代码

让我来为你详细讲解“Java实现Dijkstra算法的示例代码”的完整攻略。

什么是Dijkstra算法?

Dijkstra算法是一种用于在加权图中查找最短路径的算法。其基本思路是从起点开始,依次考虑所有可能的路径,并选择当前距离最近的节点作为下一个起点。通过不断更新节点的最短距离,最终找到起点到终点的最短路径。

实现步骤

实现Dijkstra算法的步骤如下:

  1. 初始化:将起点的距离设置为0,其他节点的距离设置为无穷大;
  2. 选择当前距离最近的节点作为下一个起点;
  3. 遍历该节点的所有邻居节点,更新它们的最短距离;
  4. 标记该节点为已访问,重复步骤2-4,直到访问完所有节点。

Java示例代码

下面是一个简单的Java实现Dijkstra算法的示例代码:

import java.util.*;

public class DijkstraAlgorithm {

    public static void main(String[] args) {
        // 1. 构建图
        int[][] adjacencyMatrix = {{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 size = adjacencyMatrix.length;

        // 2. 初始化距离和访问状态
        int[] distances = new int[size];
        boolean[] visited = new boolean[size];
        for (int i = 0; i < size; i++) {
            distances[i] = Integer.MAX_VALUE;
            visited[i] = false;
        }

        // 3. 计算最短路径
        distances[0] = 0;
        for (int i = 0; i < size - 1; i++) {
            // 选取当前距离最近的节点
            int minDistance = Integer.MAX_VALUE;
            int current = -1;
            for (int j = 0; j < size; j++) {
                if (!visited[j] && distances[j] < minDistance) {
                    current = j;
                    minDistance = distances[j];
                }
            }

            // 更新邻居节点的最短距离
            visited[current] = true;
            for (int j = 0; j < size; j++) {
                if (adjacencyMatrix[current][j] > 0) {
                    int distance = distances[current] + adjacencyMatrix[current][j];
                    if (distance < distances[j]) {
                        distances[j] = distance;
                    }
                }
            }
        }

        // 4. 输出最短距离
        for (int i = 0; i < size; i++) {
            System.out.printf("Distance from node %d to node 0 is %d\n", i, distances[i]);
        }
    }
}

这个示例代码有以下两个说明:

示例1:

示例1中的邻接矩阵表示如下图所示的加权有向图:

 4     8

(0)--->(1)--->(2)
/| | |\
8 | |7 |2
| | |/
(7)<---(6)<---(5)
1 |
|
\/
(4)---9-->(3)

执行这段代码后,输出如下:

Distance from node 0 to node 0 is 0
Distance from node 1 to node 0 is 4
Distance from node 2 to node 0 is 12
Distance from node 3 to node 0 is 19
Distance from node 4 to node 0 is 21
Distance from node 5 to node 0 is 11
Distance from node 6 to node 0 is 9
Distance from node 7 to node 0 is 8
Distance from node 8 to node 0 is 14

结果表明从起点0到其他节点的最短距离分别是0, 4, 12, 19, 21, 11, 9, 8和14。

示例2:

在示例1的邻接矩阵中,将(4,3)的权重设置为0,则表示有个节点可以直接到达,从而改变了最短距离的计算。修改后的邻接矩阵表示如下:

 4     8

(0)--->(1)--->(2)
/| | |\
8 | |7 |2
| | |/
(7)<---(6)<---(5)
1 |
9
|
\/
(3)

修改后的代码如下:

import java.util.*;

public class DijkstraAlgorithm {

    public static void main(String[] args) {
        // 1. 构建图
        int[][] adjacencyMatrix = {{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, 0, 14, 0, 0, 0},
                                   {0, 0, 0, 0, 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 size = adjacencyMatrix.length;

        // 2. 初始化距离和访问状态
        int[] distances = new int[size];
        boolean[] visited = new boolean[size];
        for (int i = 0; i < size; i++) {
            distances[i] = Integer.MAX_VALUE;
            visited[i] = false;
        }

        // 3. 计算最短路径
        distances[0] = 0;
        for (int i = 0; i < size - 1; i++) {
            // 选取当前距离最近的节点
            int minDistance = Integer.MAX_VALUE;
            int current = -1;
            for (int j = 0; j < size; j++) {
                if (!visited[j] && distances[j] < minDistance) {
                    current = j;
                    minDistance = distances[j];
                }
            }

            // 更新邻居节点的最短距离
            visited[current] = true;
            for (int j = 0; j < size; j++) {
                if (adjacencyMatrix[current][j] > 0) {
                    int distance = distances[current] + adjacencyMatrix[current][j];
                    if (distance < distances[j]) {
                        distances[j] = distance;
                    }
                }
            }
        }

        // 4. 输出最短距离
        for (int i = 0; i < size; i++) {
            System.out.printf("Distance from node %d to node 0 is %d\n", i, distances[i]);
        }
    }
}

执行这段代码后,输出如下:

Distance from node 0 to node 0 is 0
Distance from node 1 to node 0 is 4
Distance from node 2 to node 0 is 12
Distance from node 3 to node 0 is 25
Distance from node 4 to node 0 is 23
Distance from node 5 to node 0 is 11
Distance from node 6 to node 0 is 9
Distance from node 7 to node 0 is 8
Distance from node 8 to node 0 is 14

结果表明从起点0到其他节点的最短距离分别是0, 4, 12, 25, 23, 11, 9, 8和14。可以发现,把(4,3)的权重设置为0后,起点0到终点3的最短距离变为25,而不是19。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现Dijkstra算法的示例代码 - Python技术站

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

相关文章

  • spring与mybatis整合配置文件

    整合Spring和MyBatis可以提高应用程序的可扩展性和可维护性。下面是在Spring项目中如何整合MyBatis的完整攻略: 1.添加依赖 首先,需要在pom.xml文件中引入mybatis-spring依赖。 <!– MyBatis-Spring Integration –> <dependency> <groupI…

    Java 2023年5月31日
    00
  • Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

    Java中使用正则表达式进行字符串的检索、替换等操作主要依靠Java.util.regex包中提供的类和方法。下面将从如下几个方面,介绍Java使用正则表达式进行检索、替换操作的完整攻略: 正则表达式的基础知识 在使用Java进行正则表达式操作之前,我们需要先了解一些正则表达式的基础知识,包括常用的正则表达式符号/语法、匹配模式等。下面给出一个简单的正则表达…

    Java 2023年5月27日
    00
  • Java之Jackson使用案例详解

    Java之Jackson使用案例详解 Jackson是Java中最流行的JSON序列化和反序列化库之一,它提供了轻量级快速、灵活的JSON处理方式。本文将详细讲解在Java中如何使用Jackson进行JSON序列化和反序列化。内容如下: 简介 在Java中使用Jackson进行JSON处理时,可以使用以下依赖: <!– Jackson核心模块 –&…

    Java 2023年5月26日
    00
  • springMVC中基于token防止表单重复提交方法

    以下是关于“Spring MVC中基于Token防止表单重复提交方法”的完整攻略,其中包含两个示例。 1. 前言 在Web应用程序中,表单重复提交是一个常见的问题。为了避免表单重复提交,可以使用Token机制。在Spring MVC中,可以使用Token机制来防止表单重复提交。本攻略将详细讲解Spring MVC中基于Token防止表单重复提交的方法。 2.…

    Java 2023年5月16日
    00
  • Java运算符的知识点与代码汇总

    Java运算符的知识点与代码汇总 1. 概述 Java运算符是Java语言中用于完成各种算数、关系和逻辑运算的符号。在Java程序中,运算符经常被用于各种运算表达式中,通过运算符可以组合复杂的逻辑表达式,完成各种数据计算和判断。本文将详细讲解Java运算符的知识点和一些常见的使用示例。 2. 分类 Java运算符可分为以下几类: 算术运算符 赋值运算符 自增…

    Java 2023年5月30日
    00
  • Go Java算法之简化路径实例详解

    Go Java算法之简化路径实例详解 本篇文章将详细讲解如何使用Go和Java算法来简化路径。首先,我们需要了解路径简化的定义和目的。 什么是路径简化? 路径简化是将路径中冗余的部分删除,使其变得更短、更干净、更易读。例如,路径”/a/b/c/../d”可以简化为”/a/b/d”。这不仅可以节省存储空间,还可以提高代码的效率。 路径简化的目的 路径简化有多种…

    Java 2023年5月19日
    00
  • shiro 与 SpringMVC的整合完美示例

    以下是关于“shiro 与 SpringMVC的整合完美示例”的完整攻略,其中包含两个示例。 shiro 与 SpringMVC的整合完美示例 shiro是一个强大的Java安全框架,可以用于身份验证、授权、加密等。在本文中,我们将讲解如何将shiro与SpringMVC整合,以实现安全的Web应用程序。 整合步骤 将shiro与SpringMVC整合的步骤…

    Java 2023年5月17日
    00
  • Java C++ 算法题解leetcode1582二进制矩阵特殊位置

    题目说明 在二进制矩阵中寻找特殊位置。特殊位置的定义是该位置的行和列的所有元素都是 0。 给出一个N*N 的二进制矩阵,你需要找到特殊的位置。以整数数组的形式返回特殊位置的行和列,如果不存储,返回 [-1, -1]。 解题思路 首先,遍历整个矩阵,找到所有行和列元素都为 0 的位置,将其存放到 set 集合中。 最后,对行和列分别进行遍历,判断当前行和当前列…

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