java使用Dijkstra算法实现单源最短路径

Java使用Dijkstra算法实现单源最短路径攻略

算法简介

Dijkstra算法是一种经典的计算图的单源最短路径的算法。它的基本思想是从起始点开始,首先确定该点到其他所有点的最短距离,然后以最短距离作为中介点,依次直到所有点的最短路径都被确定。Dijkstra算法主要应用在网络路由、航空等行业中。

算法步骤

  • 将图中节点分为两个集合:已确定路径的节点集合和未确定路径的节点集合,分别使用两个数组visited和distance记录。
  • 初始化过程:设置起始节点为已确定路径的节点,将其distance值设置为0,将所有其他节点的distance值设置为正无穷。
  • 重复以下过程,直到所有节点都被添加到已确定的路径集合中:
    • 从未确定路径的节点集合中选出当前distance值最小的节点,将其加入到已确定的路径集合中。
    • 更新该节点的相邻节点的distance值,如果distance变短了,则更新其父节点和最短路径。

Java代码实现

以下代码实现了Dijkstra算法,用于求解最短路径。图使用邻接矩阵来表示,Graph类包含两个方法:dijsktra方法用于求解最短路径,printResult方法用于输出结果。

public class Graph {
    private int vertexCount;
    private int[][] adjacencyMatrix;

    public Graph(int vertexCount) {
        this.vertexCount = vertexCount;
        this.adjacencyMatrix = new int[vertexCount][vertexCount];
    }

    public void dijkstra(int sourceVertex) {
        boolean[] visited = new boolean[vertexCount];
        int[] distance = new int[vertexCount];

        for (int i = 0; i < vertexCount; i++) {
            distance[i] = Integer.MAX_VALUE;
        }

        distance[sourceVertex] = 0;

        for (int i = 0; i < vertexCount - 1; i++) {
            int minDistance = Integer.MAX_VALUE;
            int minDistanceVertex = -1;

            for (int j = 0; j < vertexCount; j++) {
                if (!visited[j] && distance[j] < minDistance) {
                    minDistance = distance[j];
                    minDistanceVertex = j;
                }
            }

            visited[minDistanceVertex] = true;
            for (int k = 0; k < vertexCount; k++) {
                int edgeDistance = adjacencyMatrix[minDistanceVertex][k];
                if (edgeDistance > 0 && ((minDistance + edgeDistance) < distance[k])) {
                    distance[k] = minDistance + edgeDistance;
                }
            }
        }

        printResult(distance, sourceVertex);
    }

    public void printResult(int[] distance, int sourceVertex) {
        System.out.println("最短路径从起点 " + sourceVertex + " 到各点的距离:");
        for (int i = 0; i < vertexCount; i++) {
            System.out.println("点 " + i + ": 距离 = " + distance[i]);
        }
    }

    public static void main(String[] args) {
        Graph graph = new Graph(9);
        graph.adjacencyMatrix = new int[][]{ {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}};
        graph.dijkstra(0);
    }
}

示例说明

以下是一个基于上述代码实现的示例:

假设有以下图中的图,其中矩阵元素代表两点间的距离,0表示自身或不连通。

{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}

我们将起点设置为节点0,执行dijkstra方法,可以得到最短路径为:

最短路径从起点 0 到各点的距离:
点 0: 距离 = 0
点 1: 距离 = 4
点 2: 距离 = 12
点 3: 距离 = 19
点 4: 距离 = 21
点 5: 距离 = 11
点 6: 距离 = 9
点 7: 距离 = 8
点 8: 距离 = 14

这意味着从节点0到节点8的最短路径为14,该路径穿过节点7。

另一个示例,我们将起点设置为节点8,执行dijkstra方法:

最短路径从起点 8 到各点的距离:
点 0: 距离 = 14
点 1: 距离 = 19
点 2: 距离 = 2
点 3: 距离 = 6
点 4: 距离 = 14
点 5: 距离 = 12
点 6: 距离 = 6
点 7: 距离 = 7
点 8: 距离 = 0

这意味着从节点8到节点2的最短路径为2,该路径穿过节点5。

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

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

相关文章

  • IDEA2020.1.2创建web项目配置Tomcat的详细教程

    下面给您讲解详细的“IDEA2020.1.2创建web项目配置Tomcat的详细教程”攻略。 步骤一:安装Tomcat 在安装Tomcat之前,必须先确认JDK是否安装成功,因为Tomcat是依赖于JDK的,若JDK未安装则需要先安装JDK。可在官网上下载Tomcat安装包,解压到指定目录即可。 步骤二:创建WEB项目 1.打开Intellij IDEA,选…

    Java 2023年6月16日
    00
  • Sprint Boot @ConditionalOnClass使用方法详解

    @ConditionalOnClass是Spring Boot中的一个注解,它用于根据类路径中是否存在指定的类来决定是否启用或禁用某个组件。在使用Spring Boot开应用程序时,@ConditionalOnClass是非常有用的。本文将详细介绍@ConditionalOnClass的作用和使用方法,并提供两个示例说明。 @ConditionalOnCla…

    Java 2023年5月5日
    00
  • 基于Java的打包jar、war、ear包的作用与区别详解

    下面我将详细讲解“基于Java的打包jar、war、ear包的作用与区别详解”的完整攻略。 什么是jar、war、ear包? Java开发中,jar、war、ear包都是打包构建目标文件。其中: jar包:Java Archive,可以将Java类文件、资源文件打包到一个文件中,通常用于在命令行中运行Java应用程序或在Web服务器上部署Java Web应用…

    Java 2023年5月26日
    00
  • Nginx启用压缩及开启gzip 压缩的方法

    启用gzip压缩是一种优化网络传输的有效方法,可以减少数据传输的大小,提高性能。Nginx作为一种快速而灵活的Web服务器,支持压缩和gzip模块,并且可以通过简单的配置启用。 以下是Nginx启用gzip压缩的步骤: 1. 检查Nginx是否支持gzip模块 在nginx的安装目录下运行命令 nginx -V 可以列出所有编译参数,以及当前nginx所支持…

    Java 2023年6月15日
    00
  • sourceTree合并一次提交的内容

    sourceTree合并一次提交的内容 在基于git的开发中,经常遇到不同分支需要合并某一次特定的提交的代码,而不是合并整个代码。 场景:A分支是通用分支,B分支是私有化分支,现在A分支修改了一个通用的功能,需要合并到B分支上,功能在一次提交上。B分支只需要这次提交的代码,对A分支上改动的其他代码都不感兴趣。对此,常规的merge已经不能满足我们的需求。 1…

    Java 2023年4月27日
    00
  • java使用httpclient发送post请求示例

    下面是关于 Java 使用 HttpClient 发送 POST 请求的完整攻略。 组件 在 Java 中发送 HTTP 请求,我们可以使用 Apache 的 HttpClient 组件,它提供了一系列的 API 帮助我们创建和发送请求。 在使用 HttpClient 组件之前,需要下载 HttpClient 组件的 jar 包,并将其添加到项目依赖中。 P…

    Java 2023年5月26日
    00
  • 常见的排序算法,一篇就够了

    常见的排序算法 排序算法是计算机程序中常见的基本操作之一,它的作用是将一组无序的数据按照某种规则进行排序。在实际的开发中,经常需要对数据进行排序,比如搜索引擎中对搜索结果的排序、电商网站中对商品的排序等。 目前常见的排序算法有多种,下面将对一些常见的排序算法进行介绍: 1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数据,每次比较相邻的两个…

    Java 2023年5月19日
    00
  • Java SpringBoot的相关知识点详解

    Java Spring Boot 的相关知识点详解 一、什么是 Spring Boot? Spring Boot 是一个基于 Spring 框架的快速 Web 应用开发工具,它能够快速构建可部署的、独立的、生产级别的应用程序。相对于传统的 Spring 框架,Spring Boot 更加轻量级,具有更好的开发效率。 二、Spring Boot 的优势和功能 …

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