Dijkstra算法——通过边实现松弛

  • 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径
  • 这个时候你可能就要问了,为什么不可以直接用上一篇 只有5行的算法:Floyd-Warshall 的方法把所有的最短路都求出来,然后取一行就行了呢?
  • Floyd-Warshall算法的时间复杂度是O(N^3),而本文要介绍的Dijkstra算法时间复杂度是O(N^2),而且会在后续的里介绍优化本算法的方式。当数据过大时,Floyd-Warshall就不能再规定时间内完成了。
  • 与Floyd-Warshall算法一样,边的存储方式是二维数组。
  • 这里还需要一个dis数组,来记录1号顶点到每个顶点的距离(长度为n)、
  • 与BFS不同(虽然这个算法和bfs没啥太大联系),这个dis数组无需头指针尾指针。
  • 当然,book数组是不可缺少的。(这就导致了空间复杂度翻倍)

代码实现

#include<stdio.h>
int a[2000][2000];
int inf = 99999999;
int dis[2000], book[2000];
int main()
{int i, j, k, m, n, x, y, s, u, v;int min;scanf("%d %d", &n, &m);/* *///初始化for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (i == j)a[i][j] = 0;elsea[i][j] = inf;//读入边(有向图)for (i = 1; i <= m; i++){scanf("%d %d %d", &x, &y, &s);a[x][y] = s;}for (i = 1; i <= n; i++)dis[i] = a[1][i];for (i = 1; i <= n; i++)book[i] = 0;book[1] = 1;//Dijkstra 算法核心语句for (i = 1; i <= n; i++){//找到离1号顶点最近的点min = inf;for (j = 1; j <= n; j++){if (book[j] == 0 && dis[j] < min){min = dis[j];u = j;}}book[u] = 1;for (v = 1; v <= n; v++){if (a[u][v] < inf){if (dis[v] > dis[u] + a[u][v]){dis[v] = dis[u] + a[u][v];}}}}for (i = 1; i <= n; i++){printf("%d ", dis[i]);}return 0;
}

运行结果:

[C] Dijkstra算法——通过边实现松弛相关推荐

  1. 单源最短路 Dijkstra算法 和 SPFA算法

    单源最短路 •从一个点出发,到达其他顶点的最短路径的长度. •基本操作:松弛 •d[u]+map[u, v]< d[v]这样的边(u,v)称为紧的(tense),可以对它进行松弛(relax): ...

  2. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  3. Dijkstra算法讲解(通过边实现松弛)

    在下边的学习中,主要是学习指定一个点(源点)到其余的各个顶点的最短路径,也叫做"单源最短路径". 例如下图中的1号顶点到2,3,4,5,6顶点的最短路径: 在这里要和flody算法 ...

  4. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  5. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  6. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  7. 你必须会的--Dijkstra算法--单源最短路径问题

    文章目录 一.算法原理 1.基本原理 2.如何保存最短路径? 二.算法实战一 1.测试 2.结果 二.算法实战2 Input Output Sample Input Sample Output 一.算 ...

  8. Dijkstra算法的c++实现

    Dijkstra算法的c++实现 Dijkstra算法: 1 Dijkstra算法解决带权图的单源最短路径问题,权值要不小于0. 2 顶点集合S,保存已经找到的从源点s找到的顶点. 3 顶点集合V,保 ...

  9. 牛客网 短最优升级路径 【Dijkstra算法】+【路径记录】

    链接:https://www.nowcoder.com/questionTerminal/a7052c5bd8634edb9ccee711a5c1ea54 来源:牛客网 短最优升级路径 题目描述:游戏 ...

最新文章

  1. .Net 2.0 中的发送邮件实现小解(轉)
  2. VGA12h与VGA寄存器
  3. C++:不用申请变量交换两个变量的值
  4. OpenCV AprilTags 识别
  5. nodejs和Vue和Idea
  6. win7进入主板bios设置的方法
  7. 12.Qt中字符串相关处理
  8. ansible 第三次作业
  9. System.IO.Path 操作
  10. python数据分析论文结构_基于python数据挖掘论文_数据挖掘期末论文
  11. js调用数科阅读器_使用 Vue 和 epub.js 制作电子书阅读器
  12. flutter web集成友盟统计
  13. php 文字合成图片,PHP图片和文字合成
  14. tolua学习资料汇总贴
  15. [Games 101] Lecture 13-16 Ray Tracing
  16. idea配置文件乱码解决方法
  17. 使用虚拟信用卡在Poshmark下单教程和注意事项
  18. AFNetworking为什会请求不到数据
  19. (看得懂的)海明码的编码和校验方法
  20. 英语语法长难句——定语和定语从句

热门文章

  1. 2022-2028年中国科技馆行业研究及前瞻分析报告
  2. 有存款,才能过得更踏实
  3. 解决:UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position错误
  4. 硬件delay评估表
  5. TensorFlow优化器及用法
  6. 如何评估两张图片的差异
  7. CapsuleNet(了解)
  8. Java map 知识
  9. Python ModuleNotFoundError: No module named ‘xlrd‘
  10. More than one file was found with OS independent path 'META-INF/rxjava.properties