1. # include <stdio.h>
  2.  
  3. # define MAX_VERTEXES //最大顶点数
  4. # define INFINITY ;//代表∞
  5.  
  6. typedef struct
  7. {/* 无向图结构体 */
  8. int vexs[MAX_VERTEXES];//顶点下标
  9. int arc[MAX_VERTEXES][MAX_VERTEXES];//矩阵
  10. int numVertexes, numEdges;//顶点数和边数
  11.  
  12. }MGraph;
  13.  
  14. typedef int PathArc[MAX_VERTEXES];//存储最短路径的下表数组
  15. typedef int ShortPathTable[MAX_VERTEXES];//存储最短路径的权值数组
  16.  
  17. void CreateMGraph (MGraph *G)
  18. {/* 创建 */
  19. int i, j;
  20.  
  21. //printf ("请输入顶点数和边数");
  22. G->numVertexes = ;//顶点
  23. G->numEdges = ;//边
  24.  
  25. for (i=; i<G->numVertexes; i++)
  26. G->vexs[i] = i;//初始化顶点下标
  27.  
  28. for (i=; i<G->numVertexes; i++)//初始化矩阵
  29. for (j=; j<G->numVertexes; j++)
  30. if (i == j)
  31. G->arc[i][j] = ;//本身则0
  32. else
  33. G->arc[i][j] = INFINITY;//否则为∞
  34.  
  35. //提前手动输入
  36. G->arc[][]=;
  37. G->arc[][]=;
  38. G->arc[][]=;
  39. G->arc[][]=;
  40. G->arc[][]=;
  41.  
  42. G->arc[][]=;
  43. G->arc[][]=;
  44. G->arc[][]=;
  45. G->arc[][]=;
  46. G->arc[][]=;
  47.  
  48. G->arc[][]=;
  49. G->arc[][]=;
  50. G->arc[][]=;
  51. G->arc[][]=;
  52. G->arc[][]=;
  53.  
  54. G->arc[][]=;
  55.  
  56. for (i=; i<G->numVertexes; i++)//无向图--矩阵上三角对称下三角
  57. for (j=i; j<G->numVertexes; j++)
  58. if (i != j)
  59. G->arc[j][i] = G->arc[i][j];
  60.  
  61. return ;
  62.  
  63. }
  64.  
  65. //P数组-存放最短路径顶点的下标,D数组-存放最短路径(权值)
  66. void Shorsequence_Path_Dijkstra (MGraph G, int v0, PathArc *P, ShortPathTable *D)
  67. {/* 迪杰斯特拉 算法 - 生成最短路径 */
  68. int v, w, k, min;
  69. int final[MAX_VERTEXES]; //final[w] = 1,表示求得顶点v0→vw的最短路径
  70.  
  71. for (v=; v<G.numVertexes; v++)
  72. {//初始化
  73. final[v] = ; //全部顶点初始化为未知最短路径状态
  74. (*D)[v] = G.arc[v0][v]; //和v0有连线的点加上权值
  75. (*P)[v] = -; //初始化路径下标数组初始值为-1;
  76. }
  77.  
  78. (*D)[v0] = ; //v0→v0的路径-权值-为0
  79. final[v0] = ; //v0→v0不需要求路径
  80.  
  81. /* 开始主循环,每次循环求v0到某个v顶点的最短路径 */
  82. for (v=; v<G.numVertexes; v++)
  83. {
  84. min = INFINITY; //初始化-目前所知离v0顶点的最近距离
  85.  
  86. //注意:这里不要想着w=v;因为程序执行的时候有的顶点不符合是直接跨过去了,然后置0是为了循环访问未访问的顶点
  87. for (w=; w<G.numVertexes; w++)//查找和v0最近的顶点
  88. if (!final[w] && (*D)[w]<min)
  89. {//该顶点未被访问过,并且小于min
  90. k = w; //k存入最近顶点的下标
  91. min = (*D)[w]; //min存入最短路径
  92. }
  93.  
  94. final[k] = ; //将目前找到最近的顶点-做标记
  95.  
  96. for (w=; w<G.numVertexes; w++)//目前找到与v0最近的顶点下标k,然后继续寻找与k顶点最近的下标
  97. if (!final[w] && (min+G.arc[k][w] < (*D)[w]))
  98. {//若顶点未被访问 并且 (目前最短路径(权值)v0→k + 目前最近的顶点(k)有关联的顶点路径(权值))小于 v0有关联的权路径(权值)
  99. (*D)[w] = min + G.arc[k][w];//则与k顶点相关的权值+min--覆盖D数组
  100. (*P)[w] = k; //则与v0最近的顶点k顶点下标 给 P数组;
  101. }//(*D)[w] = min实际上就是上一个顶点和k顶点最短路径的 + arc[k][w]
  102. }
  103.  
  104. return ;
  105. }
  106.  
  107. int main (void)
  108.  
  109. {
  110. int i, j, v0;
  111. int number = ;
  112. int sequence[MAX_VERTEXES][MAX_VERTEXES];
  113. MGraph G;
  114. PathArc P;
  115. ShortPathTable D; //某点到各点的最短路径
  116. v0 = ;
  117.  
  118. CreateMGraph (&G); //创建
  119.  
  120. Shorsequence_Path_Dijkstra (G, v0, &P, &D);//迪杰斯特拉 算法 - 生成最短路径
  121.  
  122. //初始化正序输出的数组
  123. for (i=; i<G.numVertexes; i++)
  124. for (j=; j<G.numVertexes; j++)
  125. sequence[i][j] = ;
  126.  
  127. /* P数组-存放最短路径顶点的下标,D数组-存放最短路径(权值) */
  128.  
  129. printf ("最短路径倒序如下:\n");
  130. for (i=; i<G.numVertexes; i++)
  131. {
  132. printf ("v%d--v%d\t: ", v0, i);
  133. j = i;
  134. while (P[j] != -)
  135. {//若存在下一个顶点
  136. printf ("%d ", P[j]);//则输出顶点
  137. j = P[j];//按顺序查找
  138. number ++;//记录(辅助正序输出)
  139. }
  140.  
  141. //离上一个顶点最近的顶点的下标-赋值给sequence数组
  142. j = i;
  143. while (<number && P[j] != -)
  144. {
  145. sequence[i][number--] = P[j];
  146. j = P[j];
  147. }
  148. number = ;
  149. printf ("\n");
  150. }
  151.  
  152. //自己修改的
  153. printf ("\n最短路径正序如下:\n");
  154. for (i=; i<G.numVertexes; i++)
  155. {
  156. j = ;
  157. printf ("v%d--v%d\t: ", v0, i);
  158. while (sequence[i][j] != )
  159. printf ("%d ", sequence[i][j++]);
  160. printf ("\n");
  161. }
  162.  
  163. printf ("\n源点到各个点的最短路径为:\n");
  164. for (i=; i<G.numVertexes; i++)
  165. printf ("v%d--v%d : %d\n", G.vexs[], G.vexs[i], D[i]);
  166.  
  167. return ;
  168. }

迪杰斯特拉(Dijkstra)算法的更多相关文章

  1. 迪杰斯特拉Dijkstra算法介绍

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

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

    最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...

  3. 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用

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

  4. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  5. C# 迪杰斯特拉(Dijkstra)算法

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...

  6. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  7. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  8. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)

    一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...

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

    一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...

随机推荐

  1. knockout简单实用教程2

    在上一篇文章中简单了介绍了下什么ko(后文中都已ko来代替knockout.js)和一些简单的ko的使用方法下面我将介绍在实际的项目中常用到的几种绑定方式和方法. 在开始之前先拿一个dome来回顾下k ...

  2. JVM的体系结构——JVM之三

    JVM的内部体系结构分为四部分, (1)类装载器(ClassLoader)子系统 作用: 用来装载.class文件 (2)执行引擎 作用:执行字节码,或者执行本地方法 (3)垃圾回收子系统 作用:垃圾 ...

  3. ie 6 position fixed

    IE6position:fixed问题解决方案 2013-11-06 18:25:04|  分类: JS/CSS |  标签:ie6  fixed  |举报 |字号大中小订阅     普通写法 #to ...

  4. NetFlow

    供应商 支持的流 设备列表 Cisco NetFlow Cisco - 800.1700.2600.1800.2800.3800.4500.6500.7200.7300.7500.7600.10000 ...

  5. WindowProc和DefWindowProc的区别

    1. WindowProc是你给自己的窗口定义的窗口处理函数 DefWindowProc是windows平台提供的默认窗口处理函数 如果某些消息你不需要做特别的处理,调用DefWindowProc进行 ...

  6. NoSql 精粹导读图

  7. (转载博文)VC++API速查

    窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...

  8. 移动web开发前准备知识了解(html5、jquery)笔记

    1.经常使用 插件工具  chrome插件:   Mobile & Tablet Emulator(用于常见移动端适配):(重点) Mobile Emulator is an useful o ...

  9. OAuth2.0基本流程

    用户请求客户端>客户端通过在授权服务器上申请的apikey和apisceret>登录访问资源服务器

  10. 有用的HTML+CSS片段

    HTML5页面模板 现在国外很多制作新网站直接使用了HTML5代码,当然我们也得跟上,下面是一个常用的HTML5默认模板,就像你用Dreamweaver新建一个HTML文件时的代码,只不过现在这个是H ...