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日

相关文章

  • 带你入门Java的集合

    带你入门Java的集合 1. Java集合概述 Java集合是Java程序员处理数据时最常用的工具之一,它可以用于存储不同类型的数据,同时通过各种算法对数据进行操作和处理,这大大简化了Java编程的过程。Java集合是Java类库中的一部分,它主要包括两种类型:一种是Collection,另一种是Map。Collection类集合是一组元素的集合,而Map集…

    Java 2023年5月24日
    00
  • java通过实例了解值传递和引用传递

    首先,需要理解Java中两种数据类型传递方式:值传递和引用传递。值传递是指在方法调用时传递的是实际的值,而引用传递则是指传递的是对象的引用。 值传递(Value Passing) Java中的基本数据类型,如int、float、boolean等都是通过值传递的方式进行传递。这意味着,当你将一个基本数据类型作为参数传递给一个方法时,它会复制参数的值,并将其传递…

    Java 2023年5月27日
    00
  • Flash 实用代码总汇第1/2页

    我们来详细讲解一下“Flash 实用代码总汇第1/2页”的完整攻略。 1. 概述 本篇攻略主要介绍了 Flash 实用代码总汇第1/2页 的使用方法,其中包含了有关 Flash 常用代码的分类、查找和使用等方面的内容。该代码总汇包含了许多 Flash 动画制作过程中可能用到的代码,对于 Flash 初学者或是想要提高 Flash 制作技能的人来说都是非常有用…

    Java 2023年6月15日
    00
  • 点击地图div上的按钮实现对地图数据的入库操作

    想要实现在点击地图div上的按钮后能够将地图数据保存到数据库中,需要按照以下步骤进行操作: 在HTML文件中,添加一个按钮到地图的div组件上。可以使用HTML中的button标签,也可以使用一张带有点击事件的图片或图标来代替,将其位置放在地图上层,使得用户能够直接点击按钮实现数据入库功能。 <div id="map" style=…

    Java 2023年6月15日
    00
  • Java如何把文件夹打成压缩包并导出

    Java 通过 ZipOutputStream 类提供了将一个文件夹打成压缩包并导出的功能。以下是详细的攻略: 第一步:导入ZipOutputStream类 为了使用ZipOutputStream类,需要先将其导入到你的Java代码中。可以使用以下代码: import java.io.FileOutputStream; import java.io.IOEx…

    Java 2023年5月19日
    00
  • IDEA快速搭建Java开发环境的教程图解

    首先,我们需要了解以下一些基本概念: JDK:Java开发工具包,是Java开发的基础包,包含编译器、运行环境等。 IDEA:IntelliJ IDEA,是一款由JetBrains开发的集成开发环境(IDE),专门用于Java开发。 Maven:是一个基于Java的项目管理工具,它可以方便地维护项目的依赖关系、自动化构建、测试、打包等操作。 以下是详细的攻略…

    Java 2023年5月20日
    00
  • Springboot配置返回日期格式化五种方法详解

    Springboot配置返回日期格式化五种方法详解 在Springboot开发中,经常会用到日期格式化,在处理时间日期类型的数据比较麻烦,需要对日期实现格式化。本文将从不同的维度,介绍五种Springboot配置返回日期格式化的方法。 1. 使用@JsonFormat注解实现格式化 使用Spring的@JsonFormat注解来实现日期的格式化输出,它可以放…

    Java 2023年5月20日
    00
  • java实现简单的俄罗斯方块

    Java实现简单的俄罗斯方块攻略 1. 搭建环境 首先需要搭建 Java 开发环境,具体可以根据个人喜好选择合适的集成开发环境(IDE),例如 Eclipse、IntelliJ IDEA 等。 2. 准备资源 在实现俄罗斯方块的过程中需要用到一些图片素材,例如方块图案,这些资源可以从图片库中或者网络下载得到。 3. 实现游戏界面 使用 Java Swing …

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