java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题

Java图论:弗洛伊德和迪杰斯特拉算法解决最短路径问题

在图论中,最短路径问题是指在一张图中,从起始点到终点的所有路径中,具有最小路径权值的路径。本文将介绍Java语言中如何使用弗洛伊德和迪杰斯特拉算法解决最短路径问题。

弗洛伊德算法

弗洛伊德算法(Floyd算法)是一种通过动态规划解决所有最短路径的算法。该算法的时间复杂度为O(n^3),因此对于大型图而言,可能不太适用。

下面是Java中使用弗洛伊德算法解决最短路径问题的代码示例:

public class Floyd {

    public static void floyd(int[][] graph) {

        int V = graph.length;

        int[][] dist = new int[V][V];

        for (int i = 0; i < V; i++) {
            for (int j = 0; j < V; j++) {
                dist[i][j] = graph[i][j];
            }
        }

        for (int k = 0; k < V; k++) {
            for (int i = 0; i < V; i++) {
                for (int j = 0; j < V; j++) {
                    if (dist[i][k] + dist[k][j] < dist[i][j]) {
                        dist[i][j] = dist[i][k] + dist[k][j];
                    }
                }
            }
        }

        printSolution(dist);
    }

    public static void printSolution(int[][] dist) {
        int V = dist.length;
        for (int i = 0; i < V; i++) {
            for (int j = 0; j < V; j++) {
                if (dist[i][j] == Integer.MAX_VALUE) {
                    System.out.print("INF ");
                }
                else {
                    System.out.print(dist[i][j] + "   ");
                }
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int[][] graph = {{0, 5, Integer.MAX_VALUE, 10},
                         {Integer.MAX_VALUE, 0, 3, Integer.MAX_VALUE},
                         {Integer.MAX_VALUE, Integer.MAX_VALUE, 0, 1},
                         {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0}};
        floyd(graph);
    }
}

上述代码中,我们定义了一个floyd()函数,它接收一个邻接矩阵作为输入,并输出所有顶点之间的最短距离。我们首先初始化dist数组为输入的邻接矩阵。

接着,我们通过三重循环遍历所有的顶点,并尝试将经过k点的路径加入到i和j之间的路径中。如果新路径的权值更小,则更新dist数组。最后输出所有的顶点之间的最短路径。

我们在main函数中调用函数,并传入我们自定义的邻接矩阵graph

迪杰斯特拉算法

迪杰斯特拉算法(Dijkstra算法)是一种解决图的单源最短路径的贪心算法。该算法的时间复杂度为O(V^2),其中V是图中所有顶点的数量。

下面是Java中使用迪杰斯特拉算法解决最短路径问题的代码示例:

import java.util.*;

public class Dijkstra {

    public void dijkstra(int[][] graph, int src) {
        int V = graph.length;
        int[] dist = new int[V];
        boolean[] sptSet = new boolean[V];

        for (int i = 0; i < V; i++) {
            dist[i] = Integer.MAX_VALUE;
            sptSet[i] = false;
        }
        dist[src] = 0;

        for (int count = 0; count < V - 1; count++) {
            int u = minDistance(dist, sptSet);
            sptSet[u] = true;
            for (int v = 0; v < V; v++) {
                if (!sptSet[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {
                    dist[v] = dist[u] + graph[u][v];
                }
            }
        }

        printSolution(dist, V);
    }

    public int minDistance(int[] dist, boolean[] sptSet) {
        int V = dist.length;
        int minIndex = -1;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < V; i++) {
            if (!sptSet[i] && dist[i] <= min) {
                min = dist[i];
                minIndex = i;
            }
        }
        return minIndex;
    }

    public void printSolution(int[] dist, int V) {
        System.out.println("Vertex   Distance from Source");
        for (int i = 0; i < V; i++) {
            System.out.println(i + "   " + dist[i]);
        }
    }

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

上述代码中,我们定义了一个dijkstra()函数,它接受一个邻接矩阵以及起始顶点作为输入,并输出每个顶点到起始顶点的最短距离。我们首先初始化一个dist数组和sptSet数组,分别表示每个顶点到起始顶点的当前距离和是否已经被遍历。

接着,在每次循环中,我们选择一个距离起始顶点最近的顶点,并将其标记为已遍历。然后遍历该顶点的所有邻居,并将它们的距离更新为它们与当前顶点的距离加上当前顶点到起始顶点的距离。最后输出每个顶点到起始顶点的最短距离。

我们在main函数中调用函数,并传入我们自定义的邻接矩阵graph和起始顶点编号0(起始顶点可以是任意点)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题 - Python技术站

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

相关文章

  • 超细致讲解Spring框架 JdbcTemplate的使用

    下面我将为您详细讲解“超细致讲解Spring框架 JdbcTemplate的使用”的完整攻略。 一、什么是JdbcTemplate JdbcTemplate是Spring框架提供的一个非常重要的特性,它是一个基于JDBC(Java数据库连接)的模板类,封装了JDBC的许多繁琐操作,使得开发者可以更加轻松便捷地操作数据库。同时,JdbcTemplate在执行S…

    Java 2023年5月19日
    00
  • Java使用反射操作数组示例

    Java反射是在程序运行时可以动态获取类的信息并操作类的属性、方法和构造器。在Java中,数组是一种特殊类型的对象,因此也可以使用反射操作数组。本文将讲述如何使用Java反射操作数组,包括获取数组信息、读取/修改数组元素、创建新数组等。 获取数组信息 要对数组进行反射操作,首先需要获取数组对象的所有信息,常用的方法有以下两种: // 获取数组类型 Strin…

    Java 2023年5月26日
    00
  • Java实现常用的三种加密算法详解

    Java实现常用的三种加密算法详解 在现今的网络环境中,数据安全越来越重要。加密算法就是保证数据安全的重要手段之一。在Java语言中,实现常用的三种加密算法十分方便。这里将分别介绍Java中常用的MD5、SHA和AES加密算法的实现方法。 1. MD5加密 MD5(Message-Digest Algorithm 5)算法是一种常用的摘要算法,可以将任意长度…

    Java 2023年5月19日
    00
  • Java工具jsch.jar实现上传下载

    下面是关于Java工具jsch.jar实现上传下载的完整攻略。 1.简介 JSch是一个java实现SSH2协议的开源库。JSch允许在java程序中进行ssh连接的操作,可以实现远程执行命令、上传文件、下载文件等操作。 2.引入jsch.jar 首先我们需要在项目中引入jsch.jar。如果使用maven管理项目,在pom.xml文件中加入以下依赖: &l…

    Java 2023年5月19日
    00
  • Java实现医院管理系统

    Java实现医院管理系统完整攻略 简介 医院管理系统是一个涉及多种功能的系统,它包含的功能有:病人管理、医生排班、药品管理、患者预约挂号等。通过Java语言实现医院管理系统,可以大大提高医院管理的效率,同时也为医院的信息化建设做出了贡献。 技术选型 为了实现医院管理系统,我们需要选择适当的技术来支撑,具体如下: 后端框架:Spring Framework 数…

    Java 2023年5月19日
    00
  • java过滤特殊字符操作(xss攻击解决方案)

    关于Java过滤特殊字符操作和XSS攻击解决方案,我将介绍以下的内容: 什么是XSS攻击和其危害 Java过滤特殊字符的两种方式 防止XSS攻击的解决方案 两个示例说明Java过滤特殊字符和防止XSS攻击的实现 1.什么是XSS攻击和其危害 XSS指的是CSS(Cascading Sytle Sheets)注入攻击,其中注入的JavaScript脚本需要网站…

    Java 2023年5月27日
    00
  • 关于Java集合框架面试题(含答案)下

    关于Java集合框架面试题(含答案)下,我们需要先了解Java集合框架的相关知识点,以及常见的相关面试题,再结合实际应用场景进行练习和分析。 以下是一些可以用来作为攻略的指导内容: 1. Java集合框架相关知识点 Java集合框架(Java Collection Framework)是一个复杂的系统,主要由4个部分组成: Collection接口:Coll…

    Java 2023年5月19日
    00
  • 使用Spring框架实现用户登录

    使用Spring框架实现用户登录可以分为以下几个步骤: 配置Spring Security 创建用户数据库 定义用户实体类 实现用户服务类 创建用户登录表单 实现登录控制器 具体实现过程如下: 1. 配置Spring Security Spring Security是一个强大的安全框架,可以实现基于角色的访问控制和身份验证等功能。我们首先需要在Spring配…

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