「今天是学习C语言第 161 天」

纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它。

# Dijkstra算法

Dijkstra算法,中文译名迪杰斯特拉算法,求解有向图和无向图单源最短路径的算法,要求图中的边权重值必须是非负数(0或正数)。

给定图,图中有顶点和边权重值,给定一个源顶点,可以求出该顶点到其它所有顶点的最短路径,生成以源顶点为根的最短路径树。

该算法使用贪心的思想,基本思想如下:

1.创建一个数组集合set,保存已经计算出最短路径的顶点,开始时,该集合为空;

2.创建辅助数组dist,保存各个顶点的路径值,初始时指定的源顶点赋值为0,其余顶点赋值为无穷大;

3.迭代以下操作,直到所有顶点均被保存到集合set中。

- 选择数组中dist中路径值最小,并且未被包括在集合中的顶点u,保存到集合set;

- 依次更新顶点u的邻接顶点在数组dist中路径值,对于邻接顶点v,如果dist[u]+dist[u][v]的路径值小于当前dist[v]的值,则更新dist[v]。

备注:dist[u]表示源顶点到顶点u的路径值,set[u]=1表示顶点u已经计算,set[u]=0表示顶点u未计算。

# 运行结果

给定以下图,求源顶点0到其它各个顶点的最短路径距离。

源顶点编号是0.目标顶点编号     最短路径距离0                01                32                63                54                75                12--------------------------------Process exited after 0.5788 seconds with return value 0请按任意键继续. . .

# 算法实现

/*========================================== 名称   :C语言实现常用数据结构 功能   :Dijkstra最短路径算法  环境   :Windows 10 + Dev-C++编译 作者   :一只会C的猫 公众号 :C语言大全(coderpointer) 时间   :2020.9.23==========================================*/#include #include // 定义图中的顶点个数#define V 6void dijkstra(int graph[V][V], int src){  int dist[V], set[V];    // 初始化  int i;  for (i = 0; i < V; i++) {    dist[i] = INT_MAX;    // 初始时顶点集合为空    set[i] = 0;  }  // 指定源顶点为起始顶点  // 源顶点到自身的路径值为0  dist[src] = 0;  // 计算所有顶点的最短路径  int count;  for (count = 0; count < V; count++)  {    // 选择最小路径的顶点    int u;    int min = INT_MAX;    int j;    for (j = 0; j < V; j++)    {      if (!set[j] && dist[j] <= min)      {        min = dist[j];        u = j;      }    }    // 将顶点u保存到集合    set[u] = 1;    // 更新顶点u的邻接顶点路径值    int k;    for (k = 0; k < V; k++)      // 顶点k未被计算,顶点u和k之间有边      if (!set[k] && graph[u][k] && dist[u] != INT_MAX        && dist[u] + graph[u][k] < dist[k])        dist[k] = dist[u] + graph[u][k];  }  // 输出结果  printf("源顶点编号是%d.\n", src);  printf("目标顶点编号 \t 最短路径距离\n");  for (i = 0; i < V; i++)    printf("%d \t\t %d\n", i, dist[i]);}int main(void){  int graph[V][V] = { { 0, 3, 8, 0, 0, 0 },              { 3, 0, 0, 2, 4, 0 },              { 8, 0, 0, 1, 6, 0 },              { 0, 2, 1, 0, 0, 8 },              { 0, 4, 6, 0, 0, 5 },              { 0, 0, 0, 8, 5, 0 }};  dijkstra(graph, 0);  return 0;}

---------- End ----------

往期精彩推荐:

一万分钟C语言学习计划:2020开篇

C语言内存管理的两种方式

C89标准库功能简介

C语言链接与存储类型

C语言标准输入输出

C语言入门基本语法

更多请点击公众号历史文章...

「喜欢C请赏个 赞    点击右下角 在看」

aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)相关推荐

  1. 大话数据结构:最短路径算法

    dijkstra最短路径算法 迪杰斯特算法的核心是首先正向把离起点最近的点一个一个找出来,然后从终点开始逆向计算最短路径 利用图数据结构实现dijkstra算法的伪代码如下 {记录所有点到起点的距离并 ...

  2. Dijkstra最短路径算法——java代码实现

    具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...

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

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

  4. 算法分析与设计课程设计-Dijkstra最短路径算法

    算法分析与设计课程设计报告书       题目:Dijkstra最短路径算法 设计人:张钦颖 班级:14计科2班    学号:1414080901218 一.     实验环境: 1.硬件环境:个人机 ...

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

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

  6. c语言是静态语言python语言是脚本语言吗_C语言还是Python语言哪个更好?

    最近,很多人问我问题. C语言还是Python,哪个更好?实际上,没有什么好坏之分,而且由于Python的基本逻辑是用C语言实现的,因此它们都有自己的特点.如果您想了解更多信息,建议您先学习C语言,然 ...

  7. 常用数据结构与经典算法 简单讲解与示例代码

    数据结构与算法 数据结构与算法是一个学习计算机绕不过去的话题,而我们大学之中多数课程之中都使用伪代码进行讲解,给对我们的学习理解也是一把双刃剑,虽然可以让我们自己通过算法.思路自己写出程序,但也可能& ...

  8. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  9. Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

    1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...

最新文章

  1. pdf怎么转html?
  2. c语言有重复元素全排列,【求助】全排列 不重复 由小到大 输出 代码
  3. Angularjs API指令查询
  4. java类与对象实验_JAVA类与对象实验报告
  5. 关于WebRTC发展的担忧和思考
  6. 解决orcale报ORA-28001: the password has expired
  7. vue 生命周期_Vue生命周期小白看了都会的
  8. 爬取了 B 站上的 17398 条评论,分析这部二次元番剧为何受到技术宅的追捧?
  9. 代码质量管控的四个阶段
  10. 计算机图形学 dda,计算机图形DDA算法
  11. 美赛O奖、F奖论文写作技巧!【微信公众号:校园数模】
  12. 吃透String的intern方法
  13. 攻防世界----confusion1
  14. alpha测试什么意思,和Beta测试有何区别?
  15. 一篇关于批处理文件的经典文章
  16. 用JLINK烧写U-boot到Nand Flash中
  17. 单细胞文献学习(part2)--stPlus: a reference-based method for the accurate enhancement of ST
  18. 走近Harvest Moon:Moonbeam DeFi狂欢会
  19. CC2640R2F BLE5.0 蓝牙协议栈Off-Chip OAD功能
  20. 极客头条 | 5月14日科技要闻:百度贴吧 2017 前贴子无法访问;网易腾讯游戏获批;苹果反垄断案败诉

热门文章

  1. HTML5_05之SVG扩展、地理定位、拖放
  2. TCP/IP数据包结构具体解释
  3. 黑马程序员--里氏转换
  4. 如果全世界人口压缩到100人
  5. 从C语言到C++的进阶之C++的非类新特性(篇三)
  6. 初学者python笔记(元组、字典、集合详解)
  7. Python使用集合实现素数筛选法
  8. Python运算符is与==的区别
  9. Python版猜数游戏
  10. Python监视进程创建情况和系统服务状态