看数据结构写代码(47)迪杰斯特拉最短路径算法
来源:互联网 发布:厉害的淘宝差评怎么写 编辑:程序博客网 时间:2024/05/16 03:58
这个算法的 思想 根 求 最小生成树算法 普里姆(Prim)算法 极其相似。迪杰斯算法 是求 一个顶点 到其他 顶点的 最短路径算法。
下面 上代码:(用的是 邻接矩阵 表示法)
//迪杰斯特拉 最短路径。//从 vex顶点 到其他 顶点的 最短路径void shortestPath_Dij(MGraph g,char vex){int loc = graphLocation(g,vex);int minArray[MAX_VERTEX_NUM]={0};//最小路径值bool final[MAX_VERTEX_NUM] = {false};//是否已经完成最小路径//初始化vex 到vex 的 数据minArray[loc] = 0;final[loc] = true;int path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//路径数组,每一行 存放 vex 到这一行的 最短路径int pathLenArray[MAX_VERTEX_NUM] = {0};//存放每行路径数组的个数.for (int i = 0; i < g.vexNum; i++){minArray[i] = g.arcs[loc][i].adj;if (minArray[i] < INFINITY){//vex 指向 ipath[i][0] = i;pathLenArray[i] = 1;}}for (int i = 1; i < g.vexNum; i++)//g.verNum -1 个路径{int min = INFINITY;//最小路径值int minIndex = -1;//当前最小路径索引int notFind = -1;for (int i = 0; i < g.vexNum; i++){//在 minArray 里 寻找 值最小的(不包括已完成的)if (final[i] == false){if (minArray[i] < min){min = minArray[i];minIndex = i;}else{notFind = i;}}else if(final[i] == false){//没找到.notFind = i;}}if(minIndex == -1){//无路径时特殊处理minIndex = notFind;}final[minIndex] = true;//设置 已找到 最小路径//打印最小路径,以及 最小路径值if (minIndex != notFind){printf("%c 到 %c ,最小路径值为:%d,路径为:%c",vex,g.vexs[minIndex],min,vex);}else{printf("%c 到 %c 不可达",vex,g.vexs[minIndex],min,vex);}int minLen = pathLenArray[minIndex];for (int i = 0; i < minLen; i++){printf("→ %c",g.vexs[path[minIndex][i]]);}printf("\n");for (int i = 0; i < g.vexNum; i++){//重新 计算 最小路径 数组if (final[i] == false){int newMin = min + g.arcs[minIndex][i].adj;if (newMin < minArray[i]){minArray[i] = newMin;//重新设置路径int j;for (j = 0; j < pathLenArray[minIndex]; j++){path[i][j] = path[minIndex][j];}path[i][j] = i;pathLenArray[i] = j+1;//设置数组长度.}}}}}
在写 这段代码的时候遇到了两个问题:
1.数值 溢出,书中 用的 INT_MAX ,来表示 顶点之间 不可达的 关系。
当重新计算 最小路径数组的时候 int newMin = min + g.arcs[minIndex][i].adj; 如果 遇到了 INT_MAX,那么代码 逻辑 混乱。
所以 我把 INT_MAX 变成 短整型
#define INFINITY SHRT_MAX
2. 书中的 代码 当 没有 找到 最小值时,然后 访问 final数组 会 堆栈 溢出。加了一个特殊处理。
if(minIndex == -1){//无路径时特殊处理minIndex = notFind;}
完整源代码网盘地址:点击打开链接
运行截图:
1 0
- 看数据结构写代码(47)迪杰斯特拉最短路径算法
- 看数据结构写代码(46) 关键路径
- 看数据结构写代码(48) 弗洛伊德最短路径
- 看数据结构写代码(18) KMP算法
- 看数据结构写代码(4)单链表
- 看数据结构写代码(43) 关节点
- 看数据结构写代码(55) 二叉排序树
- 看数据结构写代码(61) 哈希表
- 看数据结构写代码(65) 基数排序
- 看数据结构写代码(2) 选择排序 和 冒泡排序 算法优化
- 看数据结构写代码(1) 三元组
- 看数据结构写代码(3)顺序表的 实现
- 看数据结构写代码(5)静态链表
- 看数据结构写代码(8)顺序栈的实现
- 看数据结构写代码(9)链栈的实现
- 看数据结构写代码(19) 数组的实现
- 看数据结构写代码(41) 强连通分量
- 看数据结构写代码(42)最小生成树
- 哈希表的线性探查法搜索算法
- 用rand7()构造rand10()
- eclipse中调试tomcat下的web应用
- python内建模块之hashlib
- Android SDK 更新
- 看数据结构写代码(47)迪杰斯特拉最短路径算法
- CM编译全教程
- INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
- spring framework 4 源码阅读
- C# 中的Throw
- 八数码问题
- eclipse远程调用debug出现 Failed to connect to remote VM because of unknown hostFailed to connect to remote
- 字符串数据类型与其他类型之间的转换
- 今天开博!