迪杰斯特拉 (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算法+A*算法+RRT算法等)-2
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
212 0
|
2月前
|
存储 人工智能 算法
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
70 0
|
9天前
|
算法 定位技术 Windows
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
15 4
|
1月前
|
算法
关于Dijkstra算法
关于Dijkstra算法
|
1月前
|
人工智能 算法 Java
【算法设计与分析】— —单源最短路径的贪心算法
【算法设计与分析】— —单源最短路径的贪心算法
32 0
|
3月前
|
算法 定位技术 C++
数据结构实训(大作业)c++模拟北斗卫星导航系统简单的迪杰斯特拉算法
数据结构实训(大作业)c++模拟北斗卫星导航系统简单的迪杰斯特拉算法
26 0
|
3月前
|
算法
bellman_ford算法与dijkstra为什么dijkstra算法不能计算带有负权边图
bellman_ford算法与dijkstra为什么dijkstra算法不能计算带有负权边图
22 0
|
3月前
|
算法
leetcode-675:为高尔夫比赛砍树 (最短路径算法bfs,dijkstra,A*)
leetcode-675:为高尔夫比赛砍树 (最短路径算法bfs,dijkstra,A*)
31 0
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真