dijkstra算法学习

一、最短路径

单源最短路径:计算源点到其他各顶点的最短路径的长度

全局最短路径:图中任意两点的最短路径

Dijkstra、Bellman-Ford、SPFA求单源最短路径

Floyed可以求全局最短路径,但是效率比较低

SPFA算法是Bellman-Ford算法的队列优化

Dijkstra算法不能求带负权边的最短路径,而SPFA算法、Bellman-Ford算法、Floyd-Warshall可以求带负权边的最短路径。

Bellman-Ford算法的核心代码只有4行,Floyd-Warshall算法的核心代码只有5行。

深度优先遍历可以求一个点到另一个点的最短路径的长度

二、dijkstra算法图解

三、算法步骤

1.初始化,选择好初始点,设总共有vexnum个节点,则总共要将vexnum-1个节点放入s中

for(i = 1;i<G.vexnum;i++)

2.遍历U,找出其中最短路径的点,并作记录(放入S中)

    // 遍历G.vexnum-1次;每次找出一个顶点的最短路径。for (i = 1; i < G.vexnum; i++){// 寻找当前最小的路径;// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 标记"顶点k"为已经获取到最短路径flag[k] = 1;

3.更新剩余U中节点的距离:设步骤2中加入的节点为k,最短距离为min,则if(k的邻居到k的距离+min)<dist(D,k的邻居),则更新dist(D,k的邻居)

        // 修正当前最短路径和前驱顶点// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp  < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}

四、完整代码

/** Dijkstra最短路径。* 即,统计图(G)中"顶点vs"到其它各个顶点的最短路径。** 参数说明:*        G -- 图*       vs -- 起始顶点(start vertex)。即计算"顶点vs"到其它顶点的最短路径。*     prev -- 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。*     dist -- 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。*/
void dijkstra(Graph G, int vs, int prev[], int dist[])
{int i,j,k;int min;int tmp;int flag[MAX];      // flag[i]=1表示"顶点vs"到"顶点i"的最短路径已成功获取。// 初始化for (i = 0; i < G.vexnum; i++){flag[i] = 0;              // 顶点i的最短路径还没获取到。prev[i] = 0;              // 顶点i的前驱顶点为0。dist[i] = G.matrix[vs][i];// 顶点i的最短路径为"顶点vs"到"顶点i"的权。
    }// 对"顶点vs"自身进行初始化flag[vs] = 1;dist[vs] = 0;// 遍历G.vexnum-1次;每次找出一个顶点的最短路径。for (i = 1; i < G.vexnum; i++){// 寻找当前最小的路径;// 即,在未获取最短路径的顶点中,找到离vs最近的顶点(k)。min = INF;for (j = 0; j < G.vexnum; j++){if (flag[j]==0 && dist[j]<min){min = dist[j];k = j;}}// 标记"顶点k"为已经获取到最短路径flag[k] = 1;// 修正当前最短路径和前驱顶点// 即,当已经"顶点k的最短路径"之后,更新"未获取最短路径的顶点的最短路径和前驱顶点"。for (j = 0; j < G.vexnum; j++){tmp = (G.matrix[k][j]==INF ? INF : (min + G.matrix[k][j])); // 防止溢出if (flag[j] == 0 && (tmp  < dist[j]) ){dist[j] = tmp;prev[j] = k;}}}// 打印dijkstra最短路径的结果printf("dijkstra(%c): \n", G.vexs[vs]);for (i = 0; i < G.vexnum; i++)printf("  shortest(%c, %c)=%d\n", G.vexs[vs], G.vexs[i], dist[i]);
}

参考资料:http://www.cnblogs.com/skywang12345/p/3711512.html

转载于:https://www.cnblogs.com/nathan2young/p/9196590.html

dijkstra算法学习相关推荐

  1. 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)

    今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...

  2. 算法学习(10):LeetCode刷题之Dijkstra最短路径算法

    前言: 迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径."图"这种数据结构的具体实现就是"邻接矩阵"或者"邻接 ...

  3. Apollo学习笔记(22)Dijkstra算法

    老规矩现奉上大神链接,https://blog.csdn.net/heroacool/article/details/51014824. 基本思想 Dijkstra算法是一种典型的最短路径搜索算法,和 ...

  4. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  5. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  6. 基于Dijkstra算法的武汉地铁路径规划!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...

  7. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  8. python实现ks算法_Python实现Dijkstra算法

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

  9. 无向图的最短路径求解算法之——Dijkstra算法

    在准备ACM比赛的过程中,研究了图论中一些算法.首先研究的便是最短路的问题.<离散数学>第四版(清华大学出版社)一书中讲解的Dijkstra算法是我首先研究的源材料. 如何求图中V0到V5 ...

最新文章

  1. 安装llvmlite报错解决:RuntimeError: llvm-config failed executing, please point LLVM_CONFIG to the path for
  2. java静态分派_Java基础——重载、静态分派与动态分派
  3. Mahout的推荐系统
  4. LeetCode 2125. 银行中的激光束数量
  5. ARM汇编编程基础之一 —— 寄存器
  6. 微软自带的浏览器Microsoft Edge不能上网的解决办法
  7. ajax返回值demo
  8. Python 下的 lambda 算子
  9. 根据输入数字显示对应的英文星期名称缩写
  10. 房地产前期投资阶段及启动阶段目标成本形成过程
  11. 安卓开发—Android基础
  12. 数据分析在微博营销中的应用
  13. 基于STM32的照片查看器课程报告
  14. EventBus介绍与使用
  15. linux申请端口,linux申请端口申请书
  16. Learning Spatiotemporal Features with 3D Convolutional Networks 读书笔记
  17. Solaris培训第二章:OpenBoot PROM(转)
  18. 西门子et200 分布式i/o_西门子ET 200简介
  19. Dell电脑 两块硬盘的efi启动分配
  20. (附源码)计算机毕业设计ssm大学生二手物品交易网站

热门文章

  1. HH SaaS电商系统的销售订单毛利润模块设计
  2. MyEclipse的build、clean、publish、clean(redeploy)的区别
  3. cap理论具体含义_架构设计之「 CAP 定理 」
  4. mysql(待完善)
  5. php 打包下载网络图片,PHP实现图片批量打包下载功能
  6. oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?
  7. python 40位的数减个位数_Python——进制表示与转换
  8. java 单例 实现_java 实现单例的各种方式
  9. esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...
  10. 1059 C语言竞赛(PAT乙级 C++)