java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

这篇具有很好参考价值的文章主要介绍了java实现迪杰斯特拉(Dijkstra)算法求解最短路问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的。是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题。

迪杰斯特拉算法采用贪心算法的策略,将所有顶点分为已标记点和未标记点两个集合,从起始点开始,不断在未标记点中寻找距离起始点路径最短的顶点,并将其标记,直到所有顶点都被标记为止。需要注意的一点是该方法不能处理带有负权边的图,下面我们举出一个实例并通过迪杰斯特拉方法对其进行求解。

图1所示为一个最短路径问题,每条边代表一条路径,边上的数值表示这条边的长度。

dijkstra,java,算法,图论

我们用迪杰斯特拉方法寻找从顶点0到顶点5的最短路径。标号结果如图2所示,图中括号里的两个数分别表示该点的父顶点标号和初始点到该点的最短路径长度。由图2可知,从节点0到节点5的最短路径长度为9,最短路径为:0 -> 2 -> 3 -> 5。

dijkstra,java,算法,图论

下面我们考虑通过java语言来实现用迪杰斯特拉算法寻找图一中的顶点0到顶点5的最短路径问题。

我们首先创建一个顶点类,属性包括id、父点和到起始点的最短距离。主方法主要分为五个部分,在第一部分进行数据的初始化;第二个部分新建一个已标记点集合,创建一个点对象作为起始顶点加入到已标记点集合中;第二部分新建一个未标记点集合,创建其余5个点并添加到未标记点集合中;第三部分为一个while循环,功能是不断的将未标记点集合中的点转移到已标记点集合中去;第五部分是路径的输出。在第四部分,每个循环中我们需要寻找要进行标记的顶点,因此我们创建了一个寻找要标记顶点的函数,其功能是在所有未标记点中寻找距离起始顶点距离最短的顶点,具体过程如下:

初始时,已标记点集合中只有源节点,未标记点集合中包含剩余所有节点。随后进入迭代,每次迭代时,首先探索从已标记节点(如vi)流出的所有有向弧,找到流出弧的尾部节点(如vj),计算从vi到vj的费用和收益以及到源节点的利润(vj到源节点的利润=vi到源节点的利润+vi到vj的利润),若该利润大于vj到源节点的最大利润,将vj到源节点的最大利润更新为该利润,将vi标记为vj的上一个节点。未标记点集合遍历完成后,若节点vj满足在所有未标记点中到源节点的利润最大,将节点vj添加到已标记点集合,并在未标记点集合中删除节点vj。

不断重复上述操作,直至未标记点集合为空集。迪杰斯特拉算法就是将所有顶点分为已标记点和未标记点两个集合,从起始点开始,不断在未标记点中寻找距离起始点利润最大的节点,并将其标记,直到所有顶点都被标记为止。详细代码如下:

import java.util.ArrayList;
import java.util.List;

public class Dijkstra {

    static int[][] matrix = new int[6][6];
    final static int N = 10000;

    public static void main(String[] args) {

        //邻接矩阵
        matrix[0] = new int[]{0, 6, 3, N, N, N};/*1*/
        matrix[1] = new int[]{6, 0, 2, 5, N, N};/*2*/
        matrix[2] = new int[]{3, 2, 0, 3, 4, N};/*3*/
        matrix[3] = new int[]{N, 5, 3, 0, 2, 3};/*4*/
        matrix[4] = new int[]{N, N, 4, 2, 0, 5};/*5*/
        matrix[5] = new int[]{N, N, N, 3, 5, 0};/*6*/

        //已标记点集合
        List<Vertex> Marked = new ArrayList<>();
        Vertex vt0 = new Vertex();
        vt0.id = 0;
        vt0.minLenth = 0;
        Marked.add(vt0);

        //未标记点集合
        List<Vertex> UnMarked = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Vertex vtx = new Vertex();
            vtx.id = i+1;
            UnMarked.add(vtx);
        }

        //将未标记点集合中的点转移到已标记点集合
        int order = 1;
        while(!UnMarked.isEmpty()){
            Vertex vtx = FindVer(Marked, UnMarked);
            UnMarked.remove(vtx);
            Marked.add(vtx);
            System.out.println("第"+order+"次标号,顶点"+vtx.id+"的标号为:(" + vtx.father.id + "," +vtx.minLenth + ")");
            order++;
        }

        //输出路径
        for(Vertex v :Marked){
            if(v.id == 5){
                System.out.println("0-5的最短路径长度为:" + v.minLenth);
                System.out.print("逆推得最优路径为:" + "5");
                while(v.id != 0){
                    v = v.father;
                    System.out.print( " -> " + v.id);
                }
            }
        } 
    }

    static Vertex FindVer(List<Vertex> Marked, List<Vertex> UnMarked){
        int M = 10000;
        Vertex v = null;
        for (Vertex ve : UnMarked) {
            for (Vertex vr : Marked) {
                int all_p = vr.minLenth + matrix[vr.id][ve.id];
                if (all_p <= ve.minLenth) {
                    ve.minLenth = all_p;
                    ve.father = vr;
                }
            }
            if (ve.minLenth < M) {
                M = ve.minLenth;
                v = ve;
            }
        }
        return v;
    }

}
class Vertex {
    public int id;
    public Vertex father;
    public int minLenth = 10000;
}

程序的运行结果如下:文章来源地址https://www.toymoban.com/news/detail-533071.html

第1次标号,顶点2的标号为:(0,3)
第2次标号,顶点1的标号为:(2,5)
第3次标号,顶点3的标号为:(2,6)
第4次标号,顶点4的标号为:(2,7)
第5次标号,顶点5的标号为:(3,9)
0-5的最短路径长度为:9
逆推得最优路径为:5 -> 3 -> 2 -> 0
进程已结束,退出代码0

到了这里,关于java实现迪杰斯特拉(Dijkstra)算法求解最短路问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(49)
  • MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    利用MATLAB绘制地图需要三个基本数据: 节点 节点坐标 节点间相通的路线 以11B交通巡警平台调度问题中的A区数据为例: (数据及工程文件下载链接见文末) Demo1: 可通过已知节点的坐标,计算出各节点之间的距离,有Matlab基础的同学可以尝试Demo2, 也可通过Excel自行实现;

    2023年04月21日
    浏览(37)
  • 使用omp并行技术加速最短路径算法-迪杰斯特拉(Dijkstra)算法(记录最短路径和距离)

    原理: Dijkstra算法是解决**单源最短路径**问题的**贪心算法** 它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径     直到求出从源点到其他各个顶点的最短路径。 首先假定源点为u,顶点集合V被划分为两部分:集合 S 和 V-S。 初始时S中仅含有源点u,

    2024年02月10日
    浏览(34)
  • 迪杰斯特拉(Dijkstra's )算法——解决带权有向无向图最短路径

    迪杰斯特拉算法(Dijkstra\\\'s Algorithm),又称为狄克斯特拉算法,是一种用于解决带权重有向图或无向图最短路径问题的算法。该算法由荷兰计算机科学家艾兹赫尔·狄克斯特拉在1956年发明,是一种广泛应用于网络路由和其他领域的算法。 在 2001 年的一次采访中,Dijkstra 博士透露

    2024年02月03日
    浏览(38)
  • 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    问题解答 (1)最小生成树(Minimal Spanning Tree)的定义 生成树的代价 :设 G ( V , E ) G(V,E) G ( V , E ) 是一个无向连通网图,生成树上 各边的权值之和 称为 生成树的代价 。 最小生成树 :在图 G G G 所有生成树中, 代价最小的生成树 为 最小生成树 。 (2)最小生成树(MST)的性

    2024年02月11日
    浏览(31)
  • Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Ford 算法 如果想求任意两点之间的距离,就需要用 Floyd 算法 求节点0 - 4 的最短路径 每次从

    2024年04月12日
    浏览(23)
  • dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 求单源有向图最短路径 使用 邻接表法 来存储顶点和边,录入 有向图 。 (当然也可以无向图,不过录入时要录入两次,比如 a b 3        b a 3)  代码如下: 测试如下:  

    2024年02月07日
    浏览(33)
  • 数据结构--迪杰斯特拉(Dijkstra)算法

    生活封锁了我们,只要我们的心不死,生活便永远不是一汪死水,而我们,依然会绽放最美的姿态。 戴克斯特拉算法(英语:Dijkstra’s algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法,并于3年后在期刊上发表。

    2024年02月04日
    浏览(37)
  • python实现Dijkstra算法求解最短路径问题(Shortest Path Problem)

    最短路问题(Shortest Path Problem,SPP)是 图论 的一个经典问题,其目的在于寻找网络中任意两个节点间的最短路径,这里的最短可以衍生为距离最短、费用最小、时间最短等一系列度量。当前的涌现了很多最短路径的变种,如带资源约束的最短路径问题(Shortest Path Problem wit

    2024年02月09日
    浏览(25)
  • (迪杰斯特拉)Dijkstra算法及其优化(C++)

    题目描述 给定一个 n n n 个点 m m m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。 请你求出 1 1 1 号点到 n n n 号点的最短距离,如果无法从 1 1 1 号点走到 n n n 号点,则输出 − 1 −1 − 1 。 输入格式 第一行包含整数 n n n 和 m m m 。 接下来 m m m 行每行包含三

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包