迪杰斯特拉(Dijkstra)算法介绍

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

迪杰斯特拉(Dijkstra)算法过程

设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di)
从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi即为最短路径

更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v通过vi到V集合中顶点的距离值,保留值较小的一个(同时也应该更新顶点的前驱节点为vi,表明是通过vi到达的)
重复执行两步骤,直到最短路径顶点为目标顶点即可结束

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};DGraph graph = new DGraph(vertex, matrix);graph.show();graph.djs(6);graph.showDjs();}
}class DGraph {public char[] vertex;public int[][] matrix;public VisitedVertex visitedVertex;public DGraph(char[] vertex, int[][] matrix) {this.vertex = vertex;this.matrix = matrix;}public void show() {for (int i = 0; i < matrix.length; i++) {System.out.println(Arrays.toString(matrix[i]));}}/*** 迪杰斯特拉算法实现** @param index 表示出发顶点对应的下标*/public void djs(int index) {visitedVertex = new VisitedVertex(vertex.length, index);// 更新出发顶点到周围顶点的距离和前驱顶点update(index);for (int i = 1; i < vertex.length; i++) {// 选择并返回新的访问顶点index = visitedVertex.updateArr();// 更新新的访问顶点到周围顶点的距离和前驱顶点update(index);}}// 更新index下标顶点到周围顶点的距离和周围顶点的前驱顶点public void update(int index) {int len = 0;// 根据遍历我们的邻接矩阵的  matrix[index]行for (int i = 0; i < matrix[index].length; i++) {// len 含义是 : 出发顶点到index顶点的距离 + 从index顶点到j顶点的距离的和len = visitedVertex.dis[index] + matrix[index][i];// 如果i顶点没有被访问过,并且 len 小于出发顶点到i顶点的距离,就需要更新boolean flag = visitedVertex.visited[i] == 0 && len < visitedVertex.dis[i];if (flag) {// 更新i顶点的前驱为index顶点visitedVertex.preVisited[i] = index;// 更新出发顶点到i顶点的距离visitedVertex.dis[i] = len;}}}public void showDjs() {visitedVertex.show();}
}class VisitedVertex {// 记录各个顶点是否访问过 1表示访问过,0未访问,会动态更新public int[] visited;// 每个下标对应的值为前一个顶点下标, 会动态更新public int[] preVisited;// 记录出发顶点到其他所有顶点的距离,比如G为出发顶点,就会记录G到其它顶点的距离,会动态更新,求的最短距离就会存放到dispublic int[] dis;public VisitedVertex(int len, int index) {this.visited = new int[len];this.preVisited = new int[len];this.dis = new int[len];// 初始化 dis数组距离为65535,index顶点为0Arrays.fill(dis, 65535);this.dis[index] = 0;this.visited[index] = 1;}/*** 继续选择并返回新的访问顶点, 比如这里的G 完后,就是 A点作为新的访问顶点(注意不是出发顶点)** @return*/public int updateArr() {int min = 65535;int index = 0;for (int i = 0; i < visited.length; i++) {if (visited[i] == 0 && dis[i] < min) {min = dis[i];index = i;}}visited[index] = 1;return index;}public void show() {System.out.println(Arrays.toString(visited));System.out.println(Arrays.toString(preVisited));System.out.println(Arrays.toString(dis));}
}
[1, 1, 1, 1, 1, 1, 1]
[6, 6, 0, 5, 6, 6, 0]
[2, 3, 9, 10, 4, 6, 0]

十大算法之迪杰斯特拉算法相关推荐

  1. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  2. 0096 克鲁斯卡尔算法,迪杰斯特拉算法

    /*  * 克鲁斯卡尔算法  * 1.用来求加权连通图的最小生成树的算法  * 2.思想:按照权值从小到大的顺序,选择n-1条边,并保证这n-1条边不构成回路  * 3.先构造一个只含n个顶点的森林, ...

  3. 数据结构第十二天——普利姆算法和迪杰斯特拉算法

    普利姆(Prim)算法求最小生成树,也就是在包含 n个顶点的连通图中,找出只有(n-1)条边包含所有 n个顶点的连通子图,也就是所谓的极小连通子图 最小生成树:给定一个带权的无向连通图,如何选取一棵生 ...

  4. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  5. 计算机网络课程实验4——编程实现路由算法(迪杰斯特拉算法)

    实验目的: 运用各种编程语言实现基于 Dijkstra 算法的路由软件. 实验意义: 通过本实验,使学生能够对路由原理和路由算法有进一步的理解和掌握. 实验步骤: 1, 选择合适的编程语言编程实现基于 ...

  6. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

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

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

  8. 【数据结构与算法】迪杰斯特拉算法的介绍和最短路径问题程序实现

    目录 1. 迪杰斯特拉算法的介绍 2. 迪杰斯特拉算法的原理 3. 最短路径问题介绍 1. 迪杰斯特拉算法的介绍 迪杰斯特拉(Dijkstra)算法是典型求两点之间最短路径算法.它的主要特点是以起始点 ...

  9. 最短路径的两种算法(迪杰斯特拉算法和弗洛伊德算法)

    一.迪杰斯特拉(Dijkstra)算法 1.定义描述 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩 ...

  10. 算法系列——迪杰斯特拉算法(Dijkstra)

    本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 迪杰斯特拉算法(Dijkstra) 典型最短路径算法 ...

最新文章

  1. android 获取其他布局,android listview onItemClick中获取其他item的布局
  2. 阿加莎·克莉丝蒂与我们
  3. 最近公共祖先_leetcode No.236 二叉树的最近公共祖先
  4. 实用、酷炫的可视化,你用10小时,同事用10分钟,差距在哪?
  5. 竞争者都是 飞鸽传书 高手
  6. git 32位_完整的GIT笔记 快速上手小白教程
  7. [php]php总结(2)
  8. vb怎样同时打开2个excel工作簿_【赠书】不打开工作簿也能批量合并不同文件夹下多个表格的数据...
  9. 自定义Excel中的快捷键(Alt +1)
  10. source insight设置Courier new字体
  11. db4o php,db4o官方停止支持及面向对象数据库的一些感想
  12. Java 输入输出流实验
  13. opencv之伪彩色处理
  14. STM32标准库驱动蜂鸣器
  15. 自建KMS激活服务器
  16. 汇编学习软件推荐 - 汇编金手指
  17. 线性代数笔记——第一章行列式
  18. 在嵌入式板子ARMv7 上利用neon对彩色图转换为灰度图进行加速
  19. mc服务器改哪个文件让水流动,我的世界领地关闭水流动指令_我的世界让水变没指令...
  20. Funk吉他学习笔记001 【6 Sick Funk Guitar Grooves From Leo Nocentelli of The Meters】

热门文章

  1. 自动驾驶技术发展的5个阶段和现状
  2. 解空间树搜索 及 最优解
  3. oracle 19c pdb cdb,12c、19c 从 no-cdb升级到pdb步骤
  4. 企业的五种组织架构模式
  5. 矩阵的 Jordan 标准型
  6. 数据统计获取一年 有多少个自然周,起止时间,当前是第几个周
  7. MTK平台系统稳定性分析
  8. c语言编程解百马百瓦古题,java编程题90道.doc
  9. idea隐藏菜单栏Main Menu 恢复方法
  10. P2037 电话号码