1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

2.

原图来自:http://blog.sina.com.cn/s/blog_4b9aefc20100zu8h.html

3.代码实现:

  1. /* 用邻接矩阵表示的图的Dijkstra算法的源程序*/
  2.  
  3. #include <iostream>
  4. using namespace std;
  5. #define MAXVEX 100
  6. #define MAX 1e+4
  7. typedef char VexType;
  8. typedef float AdjType;
  9.  
  10. typedef struct
  11. {
  12. int n; //图的顶点个数
  13. // VexType vexs[MAXVEX]; //顶点
  14. AdjType arcs[MAXVEX][MAXVEX]; //边
  15. }GraphMatrix;
  16.  
  17. typedef struct {
  18. // VexType vertex; //顶点信息
  19. AdjType length; // 最短路径长度
  20. int prevex; // 从v0到达vi(i=1,2,…n-1)的最短路径上vi的前驱顶点
  21. }Path;
  22. Path dist[6]; // n为图中顶点个数
  23.  
  24. void dijkstra(GraphMatrix graph, Path dist[])
  25. {
  26. int i,j,minvex;
  27. AdjType min; // 初始化,此时集合U中只有顶点v0
  28. dist[0].length = 0; dist[0].prevex = 0;
  29. graph.arcs[0][0] = 1; // 表示顶点v0在集合U中
  30.  
  31. for(i = 1; i < graph.n; i++)
  32. { // 初始化集合V-U中顶点的距离值
  33. dist[i].length=graph.arcs[0][i];
  34. if (dist[i].length != MAX)
  35. dist[i].prevex=0;
  36. else dist[i].prevex= -1;
  37. }
  38. for(i = 1; i < graph.n; i++)
  39. {
  40. min=MAX; minvex=0;
  41. for (j = 1; j < graph.n; j++) //在V-U中选出距离值最小顶点
  42. if( graph.arcs[j][j] == 0 && dist[j].length < min )
  43. {
  44. min=dist[j].length; minvex=j;
  45. }
  46. if(minvex == 0) break; // 从v0没有路径可以通往集合V-U中的顶点
  47. graph.arcs[minvex][minvex] = 1; // 集合V-U中路径最小的顶点为minvex,标记已经找过的结点
  48. for (j = 1; j < graph.n; j++)
  49. {
  50. // 调整集合V-U中的顶点的最短路径
  51. if(graph.arcs[j][j] == 1) continue;
  52. if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j]) {
  53. dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
  54. dist[j].prevex = minvex;
  55. }
  56. }
  57. }
  58. }
  59.  
  60. GraphMatrix graph;
  61.  
  62. void initgraph(){
  63. int i,j;
  64. graph.n=6;
  65. for (i = 0; i < graph.n; i++)
  66. for (j = 0; j < graph.n; j++)
  67. graph.arcs[i][j] = (i == j ? 0 : MAX);
  68. graph.arcs[0][1] = 50;
  69. graph.arcs[0][2] = 10;
  70. graph.arcs[1][2] = 15;
  71. graph.arcs[1][4] = 5;
  72. graph.arcs[2][0] = 20;
  73. graph.arcs[2][3] = 15;
  74. graph.arcs[3][1] = 20;
  75. graph.arcs[3][4] = 35;
  76. graph.arcs[4][3] = 30;
  77. graph.arcs[5][3] = 3;
  78. graph.arcs[0][4] = 45;
  79. }
  80.  
  81. int main(){
  82. int i;
  83. initgraph();
  84. dijkstra(graph, dist);
  85. for (i = 0; i < graph.n; i++)
  86. printf("结点=%d (路径长度=%.0f 上一个节点=%d)\t\n",i, dist[i].length,dist[i].prevex);
  87. system("pause");
  88. return 0;
  89. }

结果展示:

学习建议:看书对于算法理解不如代码分步运行来的直接!

图-最短路径-Dijktra(迪杰斯特拉)算法的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 最短路径之迪杰斯特拉算法的Java实现

    Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...

  3. 最短路径之迪杰斯特拉算法(Java)

    1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...

  4. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  5. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

  6. [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

    在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...

  7. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

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

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

  9. 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)

    一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...

  10. 迪杰斯特拉算法dijkstra(可打印最短路径)

    #include <iostream> #include <iomanip> #include <string> using namespace std; #def ...

随机推荐

  1. 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)

    返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...

  2. iOS开发中数组常用的五种遍历方式

    随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...

  3. Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3.  1.失焦检测. 衡量画面模糊的主要方 ...

  4. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串

    Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso  向ByteArrayOutputStream这个流理想write字节..然后可以使 ...

  5. 百度地图 api

    首先在百度开发者中心申请ak 在页面head中引用必要的css样式和js脚本 <script type="text/javascript" src="http:// ...

  6. c# BlowFish 高速 对称加密

    BlowFish 高速 对称加密 string key = "this is my key"; BlowFish algo = new BlowFish(key); string ...

  7. 将 PAGE_VERIFY 数据库选项设置为 CHECKSUM

    此规则检查 PAGE_VERIFY 数据库选项是否已设置为 CHECKSUM.为 PAGE_VERIFY 数据库选项启用 CHECKSUM 后,SQL Server 数据库引擎会在向磁盘中写入页面时计 ...

  8. CSS选择器、CSS hack及CSS执行效率

    主要内容: 1.CSS选择器.优先级与匹配原理 2. CSS 引入的方式有哪些 ? link 和 @import 的区别是 ? 3.CSS hack 4.如何书高效CSS  一.CSS选择器.优先级与 ...

  9. 【转】中间代码opcode的执行

    原文链接:http://www.orlion.ga/941/ 原文:http://www.nowamagic.net/librarys/veda/detail/1543 假如我们现在使用的是CLI模式 ...

  10. poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

    /* poj 2187 Beauty Contest 凸包:寻找每两点之间距离的最大值 这个最大值一定是在凸包的边缘上的! 求凸包的算法: Andrew算法! */ #include<iostr ...