0 最短路径问题

  1. 战争时期,胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到
    A, B, C , D, E, F 六个村庄
  2. 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里
  3. 问:如何计算出 G 村庄到 其它各个村庄的最短距离?
  4. 如果从其它点出发到各个点的最短距离又是多少?

1 Dijkstra算法

  1. 主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
  2. 以G点为起始点并标记为已访问,保持不动,原地操作:更新周围可直连顶点(A,B,E,F)到G的距离
  3. 拿到离G点距离小于极大值65535的顶点集,即(A,B,E,F),对这些顶点分别执行第2步操作
  4. 重复第2,3步,直到所有顶点都已访问
  5. 最终得到G点到其他顶点的最短距离

说明:主要广度优先搜索,同时定义三个变量:访问情况数组(用以标记顶点已访问)+前驱节点数组(用以输出最终的最短路径)+距离数组(表示出发点到各顶点的最短距离)

//迪杰斯特拉(Dijkstra)算法最佳应用-最短路径
public class DijkstraAlgorithm {public static void main(String[] args) {char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };//邻接矩阵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 = new Graph(vertex, matrix);graph.showGraph();graph.djs(2);}
}class Graph {private char[] vertex;private int[][] matrix;public Graph(char[] vertex, int[][] matrix) {this.vertex = vertex;this.matrix = matrix;}public void showGraph() {for (int[] ints : matrix) {System.out.println(Arrays.toString(ints));}}//dijkstra算法public void djs(int index) {//出发点为indexVisitedVertex vv = new VisitedVertex(vertex.length, index);//更新出发点周围顶点的前驱,以及到周围顶点的距离,ABEF可联通update(index,vv);//分别走访可联通顶点,谁近先访问,ABEF//第一轮因为ABEF距离更新了且未访问所以访问ABEF,update方法导致出发点到CD的距离更新,所以第二轮访问CDfor (int i = 1; i < vertex.length; i++) {//访问未读且可联通(dis<65535)的顶点int temp = vv.updateArr();update(temp,vv);}//输出结果vv.show();}//更新index顶点到周围顶点的距离以及更新周围顶点的前驱节点//注意:更新了距离的下一步才是访问,这里先更新距离才表示哪些顶点可联通,为访问做好准备public void update(int index, VisitedVertex vv) {int len = 0;for (int i = 0; i < matrix[index].length; i++) {len = vv.getDis(index) + matrix[index][i];if (!vv.isVisited(i) && len < vv.getDis(i)) {vv.update(i, len);vv.updatePre(i,index);}}}
}//已访问顶点集合
class VisitedVertex {public int[] already_arr;//是否访问过public int[] pre_visited;//前驱节点public int[] dis;//出发点到其他顶点的距离//构造器:初始化数组+出发点在各数组中的值public VisitedVertex(int length, int index) {already_arr = new int[length];pre_visited = new int[length];dis = new int[length];Arrays.fill(dis, 65535);Arrays.fill(pre_visited, -1);dis[index] = 0;already_arr[index] = 1;}//是否访问过public boolean isVisited(int index) {return already_arr[index] == 1;}//更新出发点到index的距离public void update(int index, int length) {dis[index] = length;}//返回距离public int getDis(int index) {return dis[index];}//更新前驱节点public void updatePre(int index, int pre) {pre_visited[index] = pre;}//访问未读但可联通(dis<65535)的顶点public int updateArr() {int min = 65535;int index = -1;for (int i = 0; i < already_arr.length; i++) {if (already_arr[i] == 0 && dis[i] < min) {min = dis[i];index = i;}}already_arr[index] = 1;return index;}//输出最后结果//说明:这里出发点的前驱应做特殊处理,通过前驱数组可展示出发点到各顶点的最短路线public void show() {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();LinkedList<String> res = new LinkedList<>();for (int i = 0; i < pre_visited.length; i++) {res.addFirst("] ");int j = i;while (true) {res.addFirst("->"+vertex[j] );j = pre_visited[j];if (j == -1) {break;}}res.addFirst("[");}for (String str : res) {System.out.print(str);}}
}

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)相关推荐

  1. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  2. 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    6 最短路径   最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...

  3. 迪杰斯特拉算法——最短路径

    分析过程: 需要构建的有向图和最短路径 分析每次取出里面的最短路径 程序执行的过程: 代码块: 迪杰斯特拉算法 : #include<stdio.h> #include<string ...

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

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

  5. 【算法】迪杰斯特拉算法 最短路径算法

    文章目录 1.概述 1.1 算法介绍 1.2 算法过程 2.代码 1.概述 太难了:https://www.bilibili.com/video/BV1E4411H73v?p=178 应用场景如下 战 ...

  6. C++——迪杰斯特拉算法弗洛伊德算法(DijkstraFloyd)for Neuedu

    采用迪杰斯特拉算法和弗洛伊德算法 求出两个景点间的最短路径和最短距离 例如下图所示的无向图: 通过输入节点个数和线路条数,分别输入各线路权值进行计算最短(最优)线路. Ps:使用Qt进行编译运行 /* ...

  7. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  8. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  9. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法局限性 二:迪杰斯特拉(dijkstra)算法基本思想 三:迪杰斯特拉(dijkstra)算法代码实现 四:迪杰斯特拉(dijkstra)算法代码视频演示 五:迪杰斯特拉(di ...

最新文章

  1. mysql ef6 事务_使用事务-EF6 | Microsoft Docs
  2. linux rz 上传文件夹_第二章Linux服务器环境搭建之Tomcat安装
  3. 7系列高速收发器总结 GTP IP核使用篇
  4. 答读者问(27):一个大一学生有关未来规划的疑问及答复
  5. [na]tcpdump非常实用的抓包实例
  6. MHA故障切换和在线手工切换原理
  7. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
  8. 配置Log4j(非常具体)
  9. 小爱同学App下架苹果App Store 网友:SiriOS警告?
  10. 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
  11. PHP 循环时间控制缓冲方法
  12. Android逆向基础笔记—Android中的常用ARM汇编指令
  13. 技术面试问项目难题如何解决的_技术面试中,遇到不会回答的问题怎么破?
  14. 台式电脑计算机怎么打不开怎么回事,为什么电脑自带的软件打不开怎么办
  15. 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-扬州人才服务网...
  16. Python实现Pearson相关系数计算及公式化简过程
  17. 图灵机和通用计算机,数学的不完美之美——阿兰?图灵与图灵机
  18. 中国游戏企业扬帆出海,应该选择怎样的云平台?
  19. 音视频多媒体开发基础概述之颜色空间(2)YUV YIQ YCrCb CMY颜色空间
  20. 变压器励磁模型 Matlab/simulink 可用于模拟电压暂降等电能质量问题

热门文章

  1. UCA-Linux系统工程师初级知识(二)【4-6】
  2. 2021年光明区深港澳科技成果转移转化基地启动资助申报时间及条件,补贴50万
  3. jumpserver堡垒机安装使用
  4. 从一位护士MM的Live Spaces上转来的人体生物钟时间表
  5. 网上流传的所谓天龙源码
  6. 用计算机专业术语写寄语,霸气辅导员用编程写毕业寄语 毕业生直呼有创意
  7. wordcloud红楼梦词云图出现单字怎么办?
  8. 搭建gitlab服务器及简单使用
  9. 如何成为部门负责人?
  10. Windows DIB文件操作详解-2.DIB转DDB