目录

  • 第7章 迪杰斯特拉算法
    • 7.1应用场景
    • 7.2算法介绍
    • 7.3 算法图解
    • 7.4代码实现
    • 本次迪杰斯特拉算法算法 的教程出自韩顺平的数据结构与算法

第7章 迪杰斯特拉算法

7.1应用场景

用场景

7.2算法介绍

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个顶点到其他顶点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。

算法过程

设置出发顶点为v,顶点集合V{ v1, v2,vi …} ,v到V中各顶点的距离构成距离集合Dis,Dis{ d1,d2,di…},Dis集合记录着b到图中各顶点的距离(到自身距离为0,v 到vi距离对应为di)

1)从Dis中选择值最小的di移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi即是最短路径

2)更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v通过vi到V集合中顶点的距离值,保留值较小的一个(同时也因该更新顶点的前驱顶点为vi,表明是通过vi到达的)

3重复执行上面两步骤,直到最短路径顶点为目标顶点即可结束。

7.3 算法图解

7.4代码实现

别看步骤繁杂,我的代码你只需要修顶点、邻接矩阵和出发点就可以使用了
实现步骤:
1、创建图类(显示图 邻接矩阵)
2、定义顶点数组 和 邻接矩阵
定义final N = 65535表示两顶点不可达
邻接矩阵赋值
3、创建图对象 测试输出图的邻接矩阵
4、记录已访问结点集合 创建一个类
创建三个数组already_arr[] pre_visited[] dis[]
1)记录各个是否已经全部访问的数组
2)记录每个顶点被访问前的前驱顶点
3)保存出发顶点与其他相怜顶点的边的距离,无边的话就是N
创建构造器(int lenth ,int index)
1)lenth:表示顶点的个数
2)index:出发顶点对应的下标
3)初始化dis[] Arrays.fi ll(dis,65535)
4)this.dis[index] = 0;
判断index顶点是否被访问过boolean类型方法
更新dis[] 更新出发顶点到index顶点的距离(int len,int index)
更新pre[] 更新pre这个顶点的前驱顶点为index顶点(int pre,int index)
返回出发顶点到index顶点的距离
5、迪杰斯特拉算法实现
创建VisitedVertex对象

6、更新index下标顶点到周围顶点的距离和周围顶点的前驱顶点
根据遍历邻接矩阵的 行
1)更新j顶点的前驱为index顶点
2)更新出发顶点到j顶点的距离
7、在4中类添加方法
继续选择并返回新的访问顶点(注意:不是出发顶点了)
8、在dis算法中更新index顶点到周围顶点的的距离和前驱

package com.ldm.dijkstra;import java.util.Arrays;/*** @author 梁东明* 2022/9/14* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解* 点击setting在Editor 的File and Code Templates 修改*/
public class DijkstraAlgorithm {static char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };public static void main(String[] args) {//邻接矩阵int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;// 表示不可以连接matrix[0]=new int[]{N, 5, 7, N, N, N, 2};matrix[1]=new int[]{5,N,N,9,N,N,3};matrix[2]=new int[]{7,N,N,N,8,N,N};matrix[3]=new int[]{N,9,N,N,N,4,N};matrix[4]=new int[]{N,N,8,N,N,5,4};matrix[5]=new int[]{N,N,N,4,5,N,6};matrix[6]=new int[]{2,3,N,N,4,6,N};//创建 Graph对象Graph graph = new Graph(vertex, matrix);//出发顶点对应的下标graph.dsj(6);//出发顶点对应的下标graph.showDijkstra(6);}
}class Graph{private char[] vertex;  //顶点数组private int[][] matrix; //邻接矩阵private VisitedVertex vv; //已经访问的顶点的集合public Graph(char[] vertex, int[][] matrix) {this.vertex = vertex;this.matrix = matrix;}//显示图public void showGraph(){for (int[] links : matrix) {System.out.println(Arrays.toString(links));}}//显示Dijkstra算法的结果public void showDijkstra(int index){vv.show(index);}/*** 迪杰斯特拉算法实现** @param index 出发顶点的下标*/public void dsj(int index){vv = new VisitedVertex(vertex.length,index);update(index); //更新index下标的顶点到周围顶点的距离和前驱顶点//这里使用到贪心算法动态规划的思想for (int j = 0; j < vertex.length; j++) {index = vv.updateArr();//选择并返回新的访问结点update(index); //更新index下标的顶点到周围顶点的距离和前驱顶点}}/*** 更新index下标顶点的周围顶点的距离和周围顶点的前驱顶点,需要遍历图** @param index index下标顶点*/private void update(int index){int len; //index下标顶点的周围顶点的距离//根据遍历邻接矩阵的 matrix[index]行 用到图的广度遍历for (int j = 0; j < matrix[index].length; j++) {// len 含义是 : 出发顶点到index顶点的距离 + 从index顶点到j顶点的距离的和len = vv.getDis(index) + matrix[index][j];// 如果j顶点没有被访问过,并且 len 小于出发顶点到j顶点的距离,就需要更新if (!vv.in(j) && len < vv.getDis(j)){vv.updatePre(j,index);  //更新j这个顶点的前驱顶点为indexvv.updateDis(j,len);    //更新j这个顶点到出发顶点的距离}}//for循环结束之后,记得要自己debug哦,不然单看代码不跟着流程走,你绝对会很懵逼//isVisited = {0,0,0,0,0,0,0}//pre_visited = {6,6,0,0,6,6,0}//dis = { 2,3,65535,65535,4,6,0}}}// 已访问顶点集合
class VisitedVertex {//记录各个顶点是否访问过 1表示访问过,0未访问,会动态更新public int[] isVisited;//保存当前顶点的前继顶点public int[] pre_visited;//记录出发顶点到其他所有顶点的距离,//比如G为出发顶点,就会记录G到其它顶点的距离,会动态更新,求的最短距离就会存放到dispublic int[] dis;char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };/**构造器* 参观了顶点** @param length 顶点的个数* @param index  出发点的下标*/public VisitedVertex(int length, int index) {this.isVisited = new int[length];this.pre_visited = new int[length];this.dis = new int[length];//初始化dis数组Arrays.fill(dis,65535);//设置出发点被访问过this.isVisited[index] = 1;//出发顶点的访问距离是0this.dis[index] = 0;}/*** 判断index是否被访问过* @param index 下标* @return 如果访问过就返回ture,否则返回false*/public boolean in(int index){return isVisited[index] == 1;}/*** 更新出发顶点到index顶点的距离** @param len 传入的距离*/public void updateDis(int index,int len){dis[index] = len;}/*** 更新 index顶点的前驱为顶点为pre顶点** @param index 传入的顶点index* @param pre 传入的顶点pre*/public void updatePre(int index,int pre){pre_visited[index] = pre;}/*** 返回出发点到index的顶点的距离** @param index 指数*/public int getDis(int index){//在第123行的方法中赋值return dis[index];}/*** 继续选择并返回新的访问顶点, 比如这里的G 完后,就是 A点作为新的访问顶点(注意不是出发顶点)** @return int*/public int updateArr(){int min = 65535, index = 0;//如果所有顶点没有被全部访问,for循环就不会退出for (int i = 0; i < isVisited.length; i++) {//当前顶点没有被访问,并且距离 小于minif ( isVisited[i] == 0 && dis[i] < min){//更新min的值min = dis[i];index = i ;}}//更新index为已访问过isVisited[index] = 1;return index;}//显示最后的结果//即将三个数组的情况输出public void show(int index) {System.out.println("==========================");//输出isVisitedSystem.out.println("所有顶点是否全部被访问?");boolean[] Visited = new boolean[isVisited.length];for (int i = 0; i < isVisited.length; i++) {if ( isVisited[i] == 1){Visited[i] = true;}}for (boolean b : Visited) {System.out.print(b+" ");}System.out.println();System.out.println("\nA B C D E F G \n对应的前驱结点为:");//输出pre_visitedfor (int i : pre_visited) {System.out.print(vertex[i] + " ");}System.out.println("\n它们的边的权值分别为");//输出dis//统计最短路径int totalWeight = 0;for(int i : dis) {System.out.print(i + " ");totalWeight += i;}System.out.println();//为了好看最后的最短距离,我们处理char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };int count = 0;for (int i : dis) {if (i != 65535) {System.out.print(vertex[count] + "("+i+") ");} else {System.out.println("N ");}count++;}System.out.println();System.out.println(vertex[index]+"到其他顶点的最短路径为:" + totalWeight);}
}
/*
实现步骤:
1、创建图类(显示图 邻接矩阵)
2、定义顶点数组  和 邻接矩阵定义final  N = 65535表示两顶点不可达邻接矩阵赋值
3、创建图对象  测试输出图的邻接矩阵
4、记录已访问结点集合 创建一个类创建三个数组already_arr[] pre_visited[] dis[]1)记录各个是否已经全部访问的数组2)记录每个顶点被访问前的前驱顶点3)保存出发顶点与其他相怜顶点的边的距离,无边的话就是N创建构造器(int lenth ,int index)1)lenth:表示顶点的个数2)index:出发顶点对应的下标3)初始化dis[] Arrays.fi ll(dis,65535)4)this.dis[index] = 0;判断index顶点是否被访问过boolean类型方法更新dis[] 更新出发顶点到index顶点的距离(int len,int index)更新pre[] 更新pre这个顶点的前驱顶点为index顶点(int pre,int    index)返回出发顶点到index顶点的距离
5、迪杰斯特拉算法实现创建VisitedVertex对象6、更新index下标顶点到周围顶点的距离和周围顶点的前驱顶点根据遍历邻接矩阵的 行1)更新j顶点的前驱为index顶点2)更新出发顶点到j顶点的距离
7、在4中类添加方法继续选择并返回新的访问顶点(注意:不是出发顶点了)
8、在dis算法中更新index顶点到周围顶点的的距离和前驱*/

本次迪杰斯特拉算法算法 的教程出自韩顺平的数据结构与算法

数据结构和算法教程,哔哩哔哩详细教程
在 178-184p.

我在这里多嘴一下,老师的教程毕竟是三年前的了,所以代码上我做了很大的修改,几乎除了思想是一样的,很多都是不同的。我强烈建议你在学的过程中最好自己手敲一边代码,不要盲目的直接抄我的。你要是拿来应付作业就当我没说。
最后,认识一下,我是小白。努力成为一名合格的程序员。期待与你的下次相遇。

迪杰斯特拉算法(Java)相关推荐

  1. java迪杰斯特拉算法介绍_178-迪杰斯特拉(Dijkstra)算法基本介绍

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  2. java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)

    package com.rao.graph; import java.util.*; /** * @author Srao * @className Dijkstra * @date 2019/12/ ...

  3. Java实现迪杰斯特拉算法

    package com.atguigu.十大程序员算法; import java.util.Arrays;public class Dijkstra {public static void main( ...

  4. 【Java】迪杰斯特拉算法

    Dijkstra's algorithm 迪杰斯特拉算法,也名迪克斯特拉算法,用以解决有向带权图的最佳路径问题. 注意:图中不可有负权!否则不可使用此算法! 本实现用到的数据结构有三. 有向带权图gr ...

  5. java迪杰斯特拉算法实例,Java 图的最短路径dijstra(迪杰斯特拉)算法和拓扑排序

    一.图的最短路径从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径 图的最短路径有许多重要的应用. 例如:上图中v0-v8有9个点,可以看做不同的地点,现在要规 ...

  6. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

    1.迪杰斯特拉算法VS弗洛伊德算法 迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径: 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一 ...

  7. 迪杰斯特拉算法(最短路径)

    描述 算法过程 代码实现 package com.atguigu.dijkstra;import com.sun.xml.internal.fastinfoset.algorithm.BooleanE ...

  8. 迪杰斯特拉算法 两点间最短路径的选择

    百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库 首页 分类 艺术 科学 自然 文化 地理 生活 社会 人物 经济 体育 历史 特色百科 历史上的今天 数字博物馆 史记·2015 城市百 ...

  9. 迪杰斯特拉c++_常用十大算法之 其九·迪杰斯特拉算法【日后详细补充】

    介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 问题-最短路径 ...

  10. 求有向图中两点最短距离java_Java 迪杰斯特拉算法实现查找最短距离

    迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...

最新文章

  1. 软路由 文件服务器拒绝,软路由踩坑
  2. CaaS环境下实践经验总结(二):监控系统部署
  3. 华为mate9 android p,安卓手机为什么越用越卡?华为Mate9搭载EMUI 5.0告别卡顿
  4. Druid SQL查询数据timeStamp时区问题
  5. 二次元风格Kratos-pjax主题 WordPress主题
  6. Wince6.0应用开发:一、平台搭建
  7. 清空数据库事务日志_通过事务日志增长加快数据库恢复和长期运行的事务
  8. python编程100例讲解_【python】编程语言入门经典100例--4
  9. git version可以卸载吗_「玩转Git命令」作为代码奴,该安装Git啦
  10. python入门笔记
  11. scrollIntoView 滚不动
  12. Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
  13. spring mvc 附件上传至腾讯云qcloud
  14. weixin公众号页面返回上一层_微信公众号jssdk打开内置地图点击返回会回到之前页面,怎么退出页面...
  15. 网络编程之:IP的ULONG方式字符串方式的相互转化
  16. Qt源码分析之信号和槽机制
  17. Python_乌龟绘图
  18. 爬取腾讯视频 xpath方式
  19. 【Hbu数据库】第七周 数据库完整性 存储过程和函数
  20. ubuntu14.04系统下对SD卡分区

热门文章

  1. Qt中打包程序运行时出现:0xc000007b错误
  2. Java--IDEA报错Project ‘org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  3. 基于matlab的am调制与仿真,基于MATLAB的AM调制及解调系统仿真分解
  4. home为什么是地点副词_home为什么可以做副词
  5. CVPR 2020 论文大盘点-去雨去雾去模糊篇
  6. Android客户端上开发人人客户端系列教程
  7. UFS的Command Queue
  8. 邮箱服务器输入密码,Foxmail的设置方法?
  9. OC 技术 防止截屏(禁止截图)(源码)
  10. 《特征工程入门与实践》读书笔记一