dijkstra(迪杰克标题斯拉算法)

参考文档

概述

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。迪杰斯特拉算法采用的是贪心策略,将Graph中的节点集分为最短路径计算完成的节点集S和未计算完成的节点集T,每次将从T中挑选V0->Vt最小的节点Vt加入S,并更新V0经由Vt到T中剩余节点的更短距离,直到T中的节点全部加入S中,它贪心就贪心在每次都选择一个距离源点最近的节点加入最短路径节点集合。迪杰斯特拉算法只支持非负权图,它计算的是单源最短路径,即单个源点到剩余节点的最短路径,时间复杂度为O(n²)。

dijkstar算法的核心思想是通过bfs加贪心策略

代码实现

package Algorithm.dijkstra;import java.util.Arrays;
import java.util.Scanner;public class DijkstraAlgorithm {//不能设置为Integer.MAX_VALUE,否则两个Integer.MAX_VALUE相加会溢出导致出现负权public static int MaxValue = 100000;public static void main(String[] args) {int[][] matrix = new int[7][7];for (int[] row : matrix) {Arrays.fill(row, MaxValue);}matrix[0][1] = 6;matrix[0][3] = 2;matrix[1][2] = 5;matrix[1][5] = 3;matrix[3][4] = 5;matrix[3][1] = 7;matrix[4][5] = 5;matrix[4][6] = 1;matrix[5][2] = 7;//调用dijstra算法计算最短路径Dijkstra(matrix, 0);}public static void Dijkstra(int[][] matrix, int source) {//最短路径长度int[] shortest = new int[matrix.length];//判断该点的最短路径是否求出int[] visited = new int[matrix.length];//存储输出路径String[] path = new String[matrix.length];//初始化输出路径for (int i = 0; i < matrix.length; i++) {path[i] = source + "->" + i;}//初始化源节点shortest[source] = 0;visited[source] = 1;for (int i = 1; i < matrix.length; i++) {int min = Integer.MAX_VALUE;int index = -1;for (int j = 0; j < matrix.length; j++) {//已经求出最短路径的节点不需要再加入计算并判断加入节点后是否存在更短路径if (visited[j] == 0 && matrix[source][j] < min) {min = matrix[source][j];index = j;}}//更新最短路径shortest[index] = min;visited[index] = 1;//更新从index跳到其它节点的较短路径for (int m = 0; m < matrix.length; m++) {if (visited[m] == 0 && matrix[source][index] + matrix[index][m] < matrix[source][m]) {matrix[source][m] = matrix[source][index] + matrix[index][m];path[m] = path[index] + "->" + m;}}}//打印最短路径for (int i = 0; i < matrix.length; i++) {if (i != source) {if (shortest[i] == MaxValue) {System.out.println(source + "到" + i + "不可达");} else {System.out.println(source + "到" + i + "的最短路径为:" + path[i] + ",最短距离是:" + shortest[i]);}}}}
}

dijkstra(迪杰克斯拉算法)相关推荐

  1. 最短路径算法——迪杰克斯拉算法/floyd算法

    最短路径算法--迪杰克斯拉算法 Dijkstra算法的思想 1.设置两个顶点集S和T,集合S中存放已经找到最短路径的顶点,集合T中存放着当前还未找到最短路径的顶点: 2.初始状态下,集合S中只包含源点 ...

  2. python3dijkstra_python3 实现Dijkstra(迪杰斯特拉)最短路径算法

    Dijkstra 单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中 ...

  3. Dijkstra(迪杰特斯拉)算法(极简版)

    示例:用Dijkstra算法求A到图中各点的最短路径 Dijkstral算法伪代码如下: n次循环至n个顶点全部遍历: 1.1从权值数组中找到权值最小的,标记该边端点k 1.2打印该路径及权值 2.1 ...

  4. 【图】Dijkstra(迪杰特斯拉)算法、左神Java版

    什么是Dijkstra 给定一个图,从某点出发到达某点给出最短的路径 比如上述图,从A出发,到其余点的最短路径,返回这样的表 思路 我们先用一个表格记录A到其余点的距离,初始值是A到A的距离为0,与其 ...

  5. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

  6. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...

  7. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...

  8. Dijkstra迪杰斯特拉算法 C++实现

    本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释.下面是我已经上传的代码资 ...

  9. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

最新文章

  1. JS-arguments分析
  2. 2001年 数的划分
  3. (转)SQL操作全集
  4. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍
  5. windbg查看设备栈设备树学习总结
  6. centos mate桌面_CentOS 7安装桌面汇总
  7. Python dataframe列拆分多行与统计
  8. 用来枚举属性的对象工具函数
  9. Java转换难题者,不适合工作(或面试)
  10. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
  11. java swing jcheckbox_Swing JCheckBox类
  12. LeetCode刷题——64. 最小路径和
  13. android模拟器登录用户,如何在模拟器上登录小米账号的游戏
  14. 2021-08-10小米盒子3增强版挂U盘刷v1.46版历程
  15. 软件各种版本的含义!例如RC,M,GA等等
  16. iOS13.0上适配深色模式
  17. android url后缀名,Android获取URL中文件的扩展名的方法
  18. win10计算机无法复制文件,Windows10系统下文件无法复制到u盘怎么解决?
  19. 移植littleVGL到STM32(个人笔记)
  20. 4G工业路由器要点介绍

热门文章

  1. 数据库mysql的索引_数据库索引
  2. 【Linux-命令】--make、makefile作用到底是什么
  3. WD My Cloud安装迅雷远程下载固件
  4. 学习的一些好网站(涨姿势的)
  5. 黑马程序员------毕老师视频笔记第十二天------多线程(3)
  6. js 求幂 Math.pow()/指数运算符`**`
  7. 2382 一半的一半(高精度大数,java)
  8. J2EE工作流管理系统jBPM详解(一)
  9. Android开发简单人脸签到系统开发
  10. 如何通过ip追踪对方的虚拟地址