迪杰斯特拉 (Dijkstra)算法求最短路径问题

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

目录
算法介绍
应用实例
算法步骤
代码实现
__

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

算法步骤
1)设置出发顶点为 v ,顶点集合 VfvI ,v2, vi .), v 到 V 各顶点的距离构成距离集合 Dis , Dis ( dI ,d2, di .), Dis 集合记录着 v 到图中各顶点的距离(到自身可以看作0, v 到 vi 距离对应为 di )
2)从 Dis 中选择值最小的 di 并移出 Dis 集合,同时移出 V 集合中对应的项点 vi ,此时的 v 到 vi 即为最短路径
3)更新 Dis 集合,更新规则为:比较 v 到 V 集合中顶点的距离值,与 v 通过 vi 到 V 集合中顶点的距离值,保留
值较小的一个(同时也应该更新顶点的前驱节点为 vi ,表明是通过 vi 到达的)
4)重复执行两步骤,直到最短路径顶点为目标顶点即可结束。
代码实现

  1. import java.util.Arrays;
  2. public class _最短路{
  3. static int[] vis;//标记已经访问的顶点 0未访问 1 访问
  4. static int[] dis;//出发顶点到各个下标对应顶点的最短距离
  5. static int[] pre;//每个下标对应的上一个顶点下标
  6. static char[] vertex;//顶点
  7. static int[][] matrix;//邻接矩阵
  8. public static void main(String[] args) {
  9. vertex= new char[]{'A','B','C','D','E','F','G'};
  10. matrix = new intvertex.length;
  11. chushihua(matrix);//初始化邻接矩阵
  12. djstl(vertex.length,6);//调用算法
  13. }
  14. public static void djstl(int length,int start) {
  15. vis=new int[length];
  16. dis=new int[length];
  17. pre=new int[length];
  18. Arrays.fill(dis, 9999);//初始化距离为较大值
  19. dis[start] = 0;//初始化出发顶点到自身的距离0
  20. / 先将起始点到与其连通的顶点的路径及pre前一个顶点进行更新/
  21. update(start);
  22. //在以与起始点相连的顶点为起点 更新距离和路径
  23. for (int i = 1; i < vertex.length; i++) {
  24. int minIndex = -1;
  25. int mindis=9999;
  26. //找到一个最短路径
  27. for (int j = 0; j < vertex.length; j++) {
  28. if(vis[j]==0 && dis[j] < mindis) {
  29. minIndex = j;
  30. mindis = dis[j];
  31. }
  32. }
  33. vis[minIndex] = 1;
  34. update(minIndex);//继续更新
  35. }
  36. System.out.println(Arrays.toString(dis));
  37. }
  38. /**
    • 以index顶点向下查找!!!以起点start到index附近的邻接结点的最短路径!!!
    • @param index
  39. */
  40. public static void update(int index) {
  41. vis[index] = 1;//index标记为已访问
  42. int len= 0;//len:从start顶点到index顶点的距离+上从index再到i顶点的距离
  43. //循环遍历每个邻接结点顶点,找到真正意义上的最短路径
  44. for (int i = 0; i < matrix[index].length; i++) {
  45. //记录从start顶点到index顶点的距离+上从index再到i顶点的距离
  46. len = dis[index] + matrixindex;
  47. //将dis[i] 即从start直接到i 的距离 与len进行比较
  48. if(vis[i] == 0 && len < dis[i]) {
  49. dis[i] = len;//更新最短路径
  50. pre[i] = index;//更新前置顶点
  51. }
  52. }
  53. }
  54. /**
    • 初始化邻接矩阵
    • @param matrix
  55. */
  56. public static void chushihua(int[][] matrix) {
  57. final int N = 9999;
  58. matrix[0]=new int[]{N,5,7,N,N,N,2};
  59. matrix[1]=new int[]{5,N,N,9,N,N,3};
  60. matrix[2]=new int[]{7,N,N,N,8,N,N};
  61. matrix[3]=new int[]{N,9,N,N,N,4,N};
  62. matrix[4]=new int[]{N,N,8,N,N,5,4};
  63. matrix[5]=new int[]{N,N,N,4,5,N,6};
  64. matrix[6]=new int[]{2,3,N,N,4,6,N};
  65. }
  66. }
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
84 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
4月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
4月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
61 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
4月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
103 0
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
2天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。
|
14天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
1天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
22天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。