直接上代码,图是由简单的邻接矩阵实现

#include <stdio.h>
#include <windows.h>
#include <limits.h>
//顶点数量
#define MAX_VEX 7
static int A[7][7] = {{0, 4, 6, 6, -1, -1, -1},{-1, 0, 1, -1, 7, -1, -1},{-1, -1, 0, -1, 6, 4, -1},{-1, -1, 2, 0, -1, 5, -1},{-1, -1, -1, -1, 0, -1, 6},{-1, -1, -1, -1, 1, 0, 8},{-1, -1, -1, -1, -1, -1, 0}};
void Dijkstra(int (*A)[7], int vex, int dist[], int path[], int flag[]);
void initpath(int A[], int vex, int path[]);
void initdist(int A[], int vex, int dist[]);
void initflag(int A[], int vex, int flag[]);
void printPath(int path[], int start_vex,int dist[]);
/*初始化 distvex 要寻找的目标点n 为顶点个数
*/
void initdist(int A[], int vex, int dist[])
{for (int i = 0; i < MAX_VEX; i++){dist[i] = A[i];}printf("初始化 dist后:");for (int i = 0; i < MAX_VEX; i++){printf("[%d]", dist[i]);}printf("\n");
}
/*初始化 pathvex 要寻找的目标点n 为顶点个数
*/
void initpath(int A[], int vex, int path[])
{for (int i = 0; i < MAX_VEX; i++){if (i == vex){path[i] = -1;continue;}if (A[i] != -1){path[i] = vex;}else{path[i] = -1;}}printf("初始化 path后:");for (int i = 0; i < MAX_VEX; i++){printf("[%d]", path[i]);}printf("\n");
}
/*初始化 flagvex 要寻找的目标点n 为顶点个数
*/
void initflag(int A[], int vex, int flag[])
{for (int i = 0; i < MAX_VEX; i++){flag[i] = 0;}flag[vex] = 1;printf("初始化 flag后:");for (int i = 0; i < MAX_VEX; i++){printf("[%d]", flag[i]);}printf("\n");
}
/*迪杰斯特拉算法,计算一个顶点到其他顶点的最短路径图使用邻接矩阵表示法A[6][6] 图对应的邻接矩阵dist[6] 当前最短路径长度 ,-1 代表不可达path[6] 记录当前最短路径下当前元素的前一个元素下标flag[6] 记录是否已处理 1代表已处理vex 要寻找的目标点n 为顶点个数
*/
void Dijkstra(int (*A)[MAX_VEX], int vex, int dist[], int path[], int flag[])
{initdist(*(A + vex), vex, dist);initpath(*(A + vex), vex, path);initflag(*(A + vex), vex, flag);//初始化完毕//核心 循环处理其余的MAX_VEX-1个元素for (int i = 0; i < MAX_VEX - 1; i++){int b = -1, max = INT_MAX; //记录最小dist及下标for (int i = 0; i < MAX_VEX; i++){//寻找到dist最小值if (dist[i] != -1 && flag[i] != 1 && vex != i && dist[i] < max){b = i;max = dist[i];}}if (b != -1){flag[b] = 1; // b标记已扫描//循环判断b点到其它顶点距离是否有更短的 有 则更改for (int i = 0; i < MAX_VEX; i++){if ((*(A + b))[i] != -1 && flag[i] != 1 && (dist[i] > dist[b] + (*(A + b))[i] || (dist[i] == -1))){dist[i] = dist[b] + (*(A + b))[i]; //改变最短路径值//改变前一个元素path[i] = b;}}}}
}
/*打印路径
*/
void printPath(int path[], int start_vex,int dist[])
{int path_trail[MAX_VEX][MAX_VEX + 1]; //用于存放遍历出的路径memset(path_trail, -1, sizeof(path_trail));for (int i = 0; i < MAX_VEX; i++){int c = 1, k = i; // path_trail 第二维下标path_trail[k][MAX_VEX] = start_vex;path_trail[k][0] = i;while (path[i] != -1){path_trail[k][c++] = path[i];i = path[i];}if (path_trail[k][1] != -1){path_trail[k][MAX_VEX] = -1;}i = k;}//按顺序打印两顶点路径for (int i = 0; i < MAX_VEX; i++){printf("顶点%d==>顶点%d最短路径:",start_vex, path_trail[i][0]);for (int j = MAX_VEX; j >= 0; j--){if (path_trail[i][j] != -1){printf("%d", path_trail[i][j]);if (j != 0){printf("-->");}}}printf("  路径长度为:%d\n", dist[path_trail[i][0]]);}
}
int main(int argc, char const *argv[])
{int vexindex = 1;int dist[MAX_VEX];int path[MAX_VEX];int flag[MAX_VEX];Dijkstra(A, vexindex, dist, path, flag);printPath(path, vexindex,dist);system("pause");
}

输出打印:

初始化 dist后:[-1][0][1][-1][7][-1][-1]
初始化 path后:[-1][-1][1][-1][1][-1][-1]
初始化 flag后:[0][1][0][0][0][0][0]
顶点1==>顶点0最短路径:1-->0  路径长度为:-1
顶点1==>顶点1最短路径:1-->1  路径长度为:0
顶点1==>顶点2最短路径:1-->2  路径长度为:1
顶点1==>顶点3最短路径:1-->3  路径长度为:-1
顶点1==>顶点4最短路径:1-->2-->5-->4  路径长度为:6
顶点1==>顶点5最短路径:1-->2-->5  路径长度为:5
顶点1==>顶点6最短路径:1-->2-->5-->4-->6  路径长度为:12

迪杰斯特拉算法简单实现相关推荐

  1. 迪杰斯特拉算法-简单容易理解

    1.最短路径算法 画一张图:简单 首先是连通图,单向连通图 1-4找到最短路径  first-last 遍历所有节点 1-所有节点判断,如果有的话前继节点就是1                    ...

  2. 迪杰斯特拉算法实现-Dijkstra 简单版

    迪杰斯特拉算法实现单源最短路 使用了 邻接表来存放图的信息,使用了优先级队列. #include <iostream> #include<queue> #include< ...

  3. Dijkstra迪杰斯特拉算法 C++实现

    本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释.下面是我已经上传的代码资 ...

  4. dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)

    假期过长,导致停更了好长时间,复习一道算法题找找感觉. 前段时间看到一篇文章,里面提到了统治世界的十大算法,其中之一就是迪杰斯特拉算法(Dijkstra),该算法主要解决的"最短路径&quo ...

  5. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法

    小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...

  6. 求有向图中两点最短距离java_Java 迪杰斯特拉算法实现查找最短距离

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

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

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

  8. 迪杰斯特拉算法-西安地铁最短路线问题

    文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...

  9. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  10. 机器人路径规划之迪杰斯特拉算法(二)

    DFS和BFS 说迪杰斯特拉算法之前,先为大家简单介绍两种常见的图论搜索算法,深度优先(DFS),广度优先(BFS). 深度优先 深度优先就是从根节点开始,找到它的第一个子节点 在找到第一个子节点的子 ...

最新文章

  1. Linux 下使用openSSL 生成RSA密钥对
  2. sqlplus几个存储过程执行变量值窜掉了_基于大数据的冷连轧过程控制优化技术研究...
  3. git批量删除没用的远程分支
  4. ParseObject 的使用简介【简单易懂】
  5. Windows 11 小技巧- WSL运行本地GPU算力
  6. 数据结构之二叉搜索树
  7. Spring MVC 流程图
  8. FCN用卷积层代替FC层原因(转)
  9. linux创建raid5分区,linux RAID5 创建过程以及raid5扩容步骤(软raid)
  10. UML教程8:构件图 部署图 附录
  11. Java大鱼吃小鱼游戏,今天你吃了吗?
  12. 证件照怎么制作?超简单的证件照制作教程来了
  13. 安全L1-AD.3-DNS代理原理及配置
  14. 关于序列化不成功的bug处理
  15. 体温单源码 delphi体温单源码 又叫三测单
  16. 阿里字体图标使用方法
  17. QUARTUS联合modelsim仿真(quartus13.0)
  18. flink使用DataStreamUtils将DataStream的数据转成Iterator迭代器的数据(如数组、列表、集合等)
  19. docker 管理和创建neo4j数据库
  20. rust进去弹出steam的对话框_电脑打开steam平台弹出一个英文框怎么办_电脑打开steam平台弹出一个英文框如何解决-系统城...

热门文章

  1. 美团外卖离线数仓建设实践
  2. 根据计算机配置设置bios,BIOS设置图解教程
  3. 网络安全学习--破解Win7密码
  4. win7添加打印机提示没有权限访问网络资源 网络不可用
  5. 大番薯本地模式怎么使用?大番薯u盘启动盘制作工具本地模式重装系统教程
  6. win10系统IIS服务器配置详细教程,win10系统配置iis的操作方法
  7. FPGA 之 SOPC 系列(三)Nios II 体系结构
  8. git如何拉去开发的 最新代码_git拉取代码到本地
  9. 常用概率分布及其数学期望和方差
  10. 卡饭论坛--金山毒霸/卫士 广告过滤规则(附纯文本版) [2015.7.1] 党生日版