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

重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的!
第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的,我想着记录在博客上以后比较好找。

如有谬误或者不足还请批评指正!

void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortPathTable &D)
{//用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]//若P[v][w]为true,则w是从v0到v当前求得最短路径上的顶点//final[v]为true当且仅当v∈S,即已经求得从v0到v的最短路径for (v = 0; v < G.vexnum; ++v){final[v] = false;D[v] = G.arcs[v0][v];for (w = 0; w < G.vexnum; ++w)P[v][w] = false; //设空路径if (D[v] < INFINITY){P[v][v0] = true;P[v][v] = true;}}D[v0] = 0; //初始化,v0顶点属于S集final[v0] = true;//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集for (i = 1; i < G.vexnum; ++i) //其余G.vexnum-1个顶点{min = INFINITY; //当前所知离v0顶点的最近距离for (w = 0; w < G.vexnum; ++w) {if (!final[w]) //w顶点在V-S中if (D[w] < min) //w顶点离v0顶点更近{v = w;min = D[w];}}final[v] = true; //离v0顶点最近的v加入S集for (w = 0; w < G.vexnum; ++w) //更新当前最短路径及距离{if (!final[w] && (min + G.arcs[v][w] < D[w])) //修改D[w]和P[w],w∈V-S{D[w] = min + G.arcs[v][w];P[w] = P[v];P[w][w] = true;}}}
}
void Dijistra(Graph G, int v)
{int s[G.vexnum]; //记录已求得的最短路径的顶点int path[G.vexnum]; //path[i]表示从源点到顶点i之间的最短路径的前驱结点int dist[G.vexnum]; //记录从源点v到其他各顶点当前的最短路径长度for (int i = 0; i < G.vexnum; i++){dist[i] = G.edge[v][i]; //若从源点v到顶点i有弧,则dist[i]为弧上的权值,否则为∞s[i] = 0; //初始时集合s为空if (G.edge[v][i] < MAX) // 若从源点v到顶点i有弧path[i] = v; //则将源点v到顶点i的最短路径的前驱结点设为velsepath[i] = -1; //否则设为-1,表示没有前驱结点}s[v] = 1; //把源点v加入集合spath[v] = -1; //设置源点v的前驱结点为-1,源点v没有前驱结点//开始主循环,每次求得源点v到顶点i的最短路径,并把顶点i加入集合sfor (int i = 0; i < G.vexnum; i++) {int min = MAX; //记录当前所知离源点v的最近距离int u; //记录离源点v最近的顶点for (int j = 0; i < G.vexnum; j++){//若顶点j不属于集合s并且最短路径长度小于minif (s[j] == 0 && dist[j] < min){min = dist[j];u = j;}} //这个for循环作用是找到离源点v最近的顶点us[u] = 1; //将顶点u加入集合s//顶点u加入后,可能需要修改源点v到集合v-s中可达顶点当前的最短路径长度for (int j = 0; j < G.vexnum; j++){//若顶点j不属于集合s并且源点v->u->j的距离比源点v->j的距离更短if (s[j] == 0 && dist[u] + G.edge[u][j]; < dist[j]){dist[j] = dist[u] + G.edge[u][j]; //则修改源点v到j的当前最短路径长度path[j] = u; //源点v->u->j,修改顶点j的前驱结点为u}}}
}

个人觉得第二个更好理解,因为path数组设置的更好。

输出源点v到顶点w的最短路径

void PrintPath(int path[], int w)
{InitStack(S); //利用辅助栈来实现逆序while (path[w] >= 0) //类似于并查集的Find操作{Push(S, w);w = path[w];} //path[源点]=-1退出循环Push(S, w); //把源点压入栈while (!StackEmpty(S)) //栈不空则循环{printf("%d ", Pop(S));}
}

Dijkstra(迪杰斯特拉)算法求单源最短路径问题相关推荐

  1. 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。

    可以用于有向图和无向图.用负数表示该有向路不通.在EditPlus上写的,所以就一个.java文件. package Test;import java.util.TreeMap; import jav ...

  2. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

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

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

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

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

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

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

  6. java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...

    Dijkstra算法是按照路径长度递增的方法计算某一点到其余各顶点的最短路径.其算法的基本思想是:把图中所有顶点分成两组,第一组包括已确定最短路径的顶点(初始只包括源点v0),第二组包括尚未确定最短路 ...

  7. 迪杰斯特拉算法求经纬度坐标的最短路径_【图的最短路径】迪杰斯特拉算法求图的最短路径...

    #include using namespace std; const int INFINITY=23678; const int M=3; /*typedef struct G { int ver[ ...

  8. 狄杰斯特拉算法:单源最短路径问题

    1.问题的引入: 在一个图中,如何根据图中的信息,从一个单一的顶点出发,寻找其他所有顶点到这个顶点的最小值呢?并且还要求最小路径是什么. 2.算法思想: 辅助定义: 引入两个集合S 和V−S, 其中第 ...

  9. 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)

    简介      Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...

最新文章

  1. char(nchar)与varchar(nvarchar)的区别以及选择
  2. 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题
  3. 我读了这七本书,写了这篇关于如何高效阅读的文章(转)
  4. 我能考虑到的数组(老)方法就这些了(es5)
  5. symfony学习笔记——路由
  6. python好用的模块和包_Python模块和包详细讲解与实例分析
  7. 设计模式之单例模式介绍
  8. struct、union、enum and sizeof
  9. 对轻量级C++日志类[转]
  10. VS2008 ~ VS2019下载地址
  11. andorid studio 无法识别app项目解决
  12. C++:利用泰勒公式求cos x近似值
  13. uniapp 微信授权,微信分享,微信支付,微信跳转app集成
  14. DevC++和ege19.01版本图形库的配置安装
  15. 剧院在线选座票务系统
  16. MFC—显示NX图标或透明背景图标
  17. 论文笔记——扩散卷积循环神经网络进行交通预测
  18. rpy角与旋转矩阵之间的转换(附完整代码)
  19. HDU 6595. Everything Is Generated In Equal Probability (期望+逆元)
  20. 西门子plc支持什么时间服务器,怎样设置PLC时间

热门文章

  1. Android 面试之20个常见 APP 架构常见面试题~
  2. 尼康D500套机相机黑屏是怎么回事
  3. 计算机方面的英语杂志,计算机类有哪些EI检索的英文期刊
  4. 用Python做一个游戏辅助脚本(含完整编程思路)
  5. 今日芯声 | 大大大!世界上最大的移动电源将前往北极圈
  6. Java公式编辑器开发思路,附项目源码
  7. 【用Python学习Caffe】7. 网络结构的修剪
  8. 灌篮青春完结篇----灌篮.青春
  9. 普通家用电风扇电机绕组
  10. 【Andrew Gelman多元统计】(基于R)