迪杰斯特拉是单源最短路算法(即只能求一点,到其他任一点的最短路径,但可以加循环得到任意两点间的最短路径),无法处理带负权变的图

算法思路图示

初始化两个集合
S={A}(只包含源点,表示已经确定最短路径的节点,一旦S中包含所有元素那么算法终止)
U={B,C,D,E,F,G}

(1)初始化,所有距离初始化为无穷大

(2)选定点A,更新(A-A距离设为0)

(3)S集合为{A,B},考察B的所有邻接点

为什么选定B加入集合S?
因为不可能还有其他路径比2还短,我不管经过C到B还是D到B都不可能是路径小于2,所以我们得到了A->B的最短路径

做完这一步,下一步加入集合S的是D
因为目前A->D的路径长度最短,为3(我已经知道了A直接到D和A经过B到D的路径长度)
如果A->B->X->D小于min{A->D,A->B->D},那么A->B->X小于min{A->D,A->B->D},那么加入集合的应该是X,这是矛盾的(接下来的操作都是一样的道理)

(4)S集合为{A,B,D},在U中没有D的邻接点,不操作

(5)S集合为{A,B,D,C},在U中没有C的邻接点,不操作

(6)S集合为{A,B,D,C,F},更新

(7)S集合为{A,B,D,C,F,E},在U中没有E的邻接点,不操作

(8)S集合为{A,B,D,C,F,E,G},在U中没有G的邻接点,不操作

代码实现:

#include <stdio.h>
#include <malloc.h>
#define MaxVex 1000
typedef struct graph{int vnum, ednum;//顶点的个数,边的个数char vexs[MaxVex];  //用来存顶点数据int edges[MaxVex][MaxVex]; //用来存边的权值(两点代替一边)
}Mgraph,*Graph;
void create(Graph &g){g = (Graph)malloc(sizeof(Mgraph));printf("请输入顶点的个数\n");scanf("%d",&g->vnum);printf("请输入边的个数\n");scanf("%d",&g->ednum);printf("请输入顶点的信息\n");for(int i=0;i<g->vnum;i++){getchar();scanf("%c",&g->vexs[i]);}printf("请输入边的起点,终点和权值\n");for(int i=0;i<g->vnum;i++)for(int j=0;j<g->vnum;j++) {if(i!=j)  g->edges[i][j] = MaxVex;//初始化 else g->edges[i][i] = 0;}int start,end,value;for(int i=0;i<g->ednum;i++){scanf("%d%d%d",&start,&end,&value);g->edges[start][end] = value;}
}
void print(Graph g){for(int i=0;i<g->vnum;i++)for(int j=0;j<g->vnum;j++) printf("%d ",g->edges[i][j]);
}
void shortPath(int *path,Graph g,int start){//start为源点的下标 bool s[g->vnum];//S集合int dist[g->vnum];
/*初始化的过程,只能走一步的最短路径,对应图片第一张和第二张
*/for(int i = 0;i<g->vnum;i++){s[i] = false;//初始化S集合,为空 dist[i] = g->edges[start][i];//初始化,源点到各个点的距离,不能直接到达值为MAX if(dist[i]<MaxVex){path[i] = start;//能到达将这个点的前一点设为start; }  else{path[i] = -1; //否则用-1表示不能到达 } }s[start] = true;//将源点加入S集合 dist[start] = 0;
/*初始化结束,开始主过程
*/
for(int i=1;i<g->vnum;i++){//除去源点,对剩下的每个点求最短路径 int min = MaxVex; int v; //用来表示点 //选择最短路径 for(int j = 0;j<g->vnum;j++){ if(s[j]==false&&dist[j]<min){//如果点在U集合里,且可以直接到达v = j; //选择一条路径 min = dist[j];//不断更新min和j,找到最小的min }} s[v] = true;//将该点加入S集合for(int k=0;k<g->vnum;k++){if(s[k]==false&&(dist[v]+g->edges[v][k])<dist[k]){dist[k]=g->edges[v][k]+dist[v];path[k]=v;}}
}for(int i = 0;i<g->vnum;i++) printf("%d ",dist[i]);printf("\n");
}int main(){    Graph g;create(g);int path[g->vnum];shortPath(path,g,0);for(int i=0;i<g->vnum;i++) printf("%d ",path[i]); return 0;
}

迪杰斯特拉算法(图示+C语言实现)相关推荐

  1. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

  2. 单源最短路径之迪杰斯特拉算法(C语言)

    Dijkstra(迪杰斯特拉)算法 采用广度优先搜索思想,对有向赋权图寻找最短路径. 该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法. 时间复杂度:O(n^2) 基本原理:不断为为 ...

  3. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  4. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言)

    图的邻接表实现迪杰斯特拉算法(C语言). 迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题. 图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是 ...

  5. 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

    西京学院导游系统 摘要   要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...

  6. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

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

  7. C语言开发东北大学活力长者社区班车路线管理(迪杰斯特拉算法)

    东北大学大作业-活力长者社区-班车路线管理(创新) 开发语言:c语言 编译工具:vscode 引用的小伙伴麻烦点下关注,有任何疑问欢迎大家留言哎 1.运行效果 2.迪杰斯特拉算法实现思路 为了求得两站 ...

  8. 迪杰斯特拉算法c语言要点,C语言迪杰斯特拉实现最短路径算法要点.doc

    C语言迪杰斯特拉实现最短路径算法要点.doc 数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二. ...

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

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

  10. 迪杰斯特拉算法c语言6,C语言迪杰斯特拉实现最短路径算法.doc

    数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二.邻接矩阵建立流程图:- 3 - 三.迪杰斯特拉 ...

最新文章

  1. ELK结合logback搭建日志中心
  2. 人工智能之神经网络要进入的下一个阶段-演绎推理
  3. combobox 怎么实现对listview的类别查询_Flutter实战之独立实现官网Demo单词收藏Demo
  4. oracle某个存过的执行时间,java – 为什么oracle存储过程的执行时间会大大增加,具体取决于它的执行方式?...
  5. Google和IMAX放弃VR相机
  6. 足不出户,游遍七大洲,不可错过的14部地理纪录片!
  7. c++ 数组的输入遇到特定字符停止输入_C语言 第4章-字符串和格式化输入/输出
  8. 11 - java构造方法
  9. 初中在线测试软件,关注中学生 心理测试工具上线!
  10. Visual Studio 2019 for Mac 8.6 发布
  11. 你不知道的JavaScript(上中下)全册
  12. 测试硬件工程师常用英语单词
  13. css中flex设置为1是什么意思
  14. Creator仿超级玛丽小游戏源码分享
  15. jmeter手动添加cookie及线程间cookie共享的2种方法
  16. chmod 777的含义
  17. 最大流的Ford-Fulkerson 标号法
  18. android 悬浮窗口禁止横屏显示,悬浮窗强制设置屏幕方向|App开发交流区|研发交流|雨滴科技技术论坛 - Powered by Discuz!...
  19. 程序员面试时应该知道的福利待遇
  20. anaconda安装包百度云下载

热门文章

  1. 我要开始记单词啦(定时记录背单词历程)
  2. 获取计算机用户名称的方法,javascript读取用户名和计算机名
  3. Java简单循环依赖的解决 —— spring_imitate(Spring的模仿)
  4. 【githubshare】开源的小说下载与阅读工具:Uncle 小说。目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说
  5. 长春甲骨文华育兴业|大数据社会的十三大具体应用场景
  6. 南京信息工程大学计算机与科学专业,2019南京信息工程大学专业排名
  7. Linux问题_02:tar: 它似乎不像是一个 tar 归档文件
  8. 计算机保研面试 / 考研复试常见问题整理
  9. 大量精品国学论文免费下载
  10. VB6.0代码窗口不支持鼠标中键操作滚动条解决方法