文章目录

  • 一、Dijkstra是什么?
  • 二、使用步骤
    • 1.Dijkstra的基本原理
    • 2.时间复杂度
  • 三.代码实现思路
  • 四.代码实现
  • 总结

一、Dijkstra是什么?

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

二、使用步骤

1.Dijkstra的基本原理

其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在-个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边, 因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。

2.时间复杂度

Dijkstra时间复杂度为O(n^2),朴素版Dijkstra因为不受变的限制,适用于稠密图形;
如果题目中的n,m的范围在10^5之内的话就不能朴素版Dijkstra算法,需要用堆优化版Dijkstra算法;
堆优化板Dijkstra时间复杂度为O(mlog(n));堆优化版这节就不介绍了O(∩_∩)O,如果感兴趣的话可以去看看这题堆优化版Djikstra模板题

三.代码实现思路

①.初始化我们的距离
dist[1] = 0, dist[i] = +∞ 这里是因为只有我们的起点是确定的,其余都没有被确定

②.迭代过程
for(int i = 1; i <= n; i ++)
第一步 集合S : 当前已经确定最短距离的点
第二步 集合T : 不在S中的距离最近的点我们给集合T
第三步 用集合T来更新其他所有点的距离

更新的方式是什么呢,从t出去的所以的边能不能更新所以点的距离,看1→x的距离,能不能用1→t→x的来更新其实代码实现就是
dist[x] > dist[t] + w w为权重;

四.代码实现

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510;int n, m;
int g[N][N];
int dist[N];
bool st[N];int dijkstra()
{memset(dist, 0x3f, sizeof dist);//将其它的点取为正无穷,第一个点为0dist[1] = 0;for(int i = 0; i < n; i++){int t = -1;for(int j = 1; j <= n; j ++){if(!st[j] && (t == -1 || dist[t] > dist[j]))t = j;}st[t] = true;for(int j = 1; j <= n; j ++)dist[j] = min(dist[j], dist[t] + g[t][j]);}if(dist[n] == 0x3f3f3f3f)  return -1;return dist[n];
}
int main()
{cin >> n >> m;memset(g, 0x3f, sizeof g);while (m -- ){int a, b ,c ;cin >> a >> b >> c;g[a][b] = min(g[a][b], c); //可能会有重复的值,取最小的那一个}int t = dijkstra();cout << t << endl;return 0;
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了朴素版Dijkstra的使用,而Dijkstra是方便于我们在有很多条边的时候求第一个点到最后一个点的最短距离

朴素版Dijkstra算法相关推荐

  1. 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II

    堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...

  2. 朴素版dijkstra(稠密图)

    题目: 稠密图只需要用邻接矩阵来存就可以了,两个点之间可能存在重边,由于求最短路只需要把最小的存起来就可以了 初始化: 用dist[]来存储每个点到源点的最短距离,还未被更新过的用INF来表示,若是d ...

  3. ~~朴素版prim算法

    时间复杂度是O(n2+m), n 表示点数,m 表示边数 int n; // n表示点数 int g[N][N]; // 邻接矩阵,存储所有边 int dist[N]; // 存储其他点到当前最小生成 ...

  4. Dijkstra算法详解

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

  5. PAT甲级1003 Emergency Dijkstra算法(堆优化版/朴素版)

    前言   最近花了很多的时间在写JAVA项目上面,疏忽了算法和数据结构的学习.最近突然醒悟基础更为重要,打算从今天开始每天抽出一些时间做下PAT甲级的题目.现有题库的前两题很简单,从第三题开始吧. 题 ...

  6. Dijkstra算法和堆优化

    目录 Dijkstra介绍 算法思想 具体步骤 代码实现 Dijkstra链式向前星 优化思路 实现步骤 代码实现 Dijkstra链式向前星堆优化 优化思路 优化步骤 代码实现 参考资料(帮助理解代 ...

  7. Dijkstra算法与其最小堆优化

    (仿佛回到了当年打比赛的时候呢 POJ 3013(Big Christmas Tree) 传送门:http://poj.org/problem?id=3013 题目大意:由一堆顶点和边构造出一棵圣诞树 ...

  8. 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版

    文章目录 Dijkstra算法 ①朴素版(适用于稠密图) 具体实现 ②堆优化版 具体实现 Dijkstra算法 适用于单源最短路且边权都为正数 例:输入有向图/无向图,输出n号点到1号点的最短距离 ① ...

  9. 【Dijkstra算法】未优化版+优先队列优化版

    https://blog.csdn.net/YF_Li123/article/details/74090301 Dijkstra算法伪代码://G为图:数组d为源点到达各点的最短路径长度,s为起点 D ...

最新文章

  1. [MySQL FAQ]系列 -- MySQL支持绑定到多个ip上吗
  2. oracle plan_table,Oracle 执行计划 提示 'PLAN_TABLE' is old version 解决方法
  3. Juniper SRX防火墙系统会话链接的清除
  4. 12.映射表map.rs
  5. 在${}中为甚么采用@Param及多参数查询@Param
  6. dpkg ihr状态_考勤机数据无法同步
  7. 国内各大平台的推荐算法,看到360的时候笑喷了……
  8. k8s—centos7安装部署NFS服务器和客户端及基于nfs的动态存储storageclass使用总结
  9. c语言程序女设计教学效果分析,C语言程序设计的教学论文
  10. Linux(centOS)手动安装删除Apache+MySQL+PHP+Memcached原创无错版
  11. .set伪指令(mips)
  12. Android系统信息获取 之六:网络连接状态信息获取
  13. 解决知网外文文献无法下载全文的问题
  14. windows 10 英文版显示中文乱码
  15. struts2拦截器实现登录控制
  16. ecs 导出mysql文件_mysql导出数据库文件
  17. [Python从零到壹] 五十九.图像增强及运算篇之图像锐化Scharr、Canny、LOG实现边缘检测
  18. selenium实现163邮箱登录
  19. java json 长度限制_tomcat解决POST请求过长的限制
  20. android中转换content://media/external/images/media/539163为/storage/emulated/0/DCIM/Camera/IMG_20160807_

热门文章

  1. 『力扣刷题』5275_找出井字棋的获胜者 解题代码
  2. CSS的类名命名规范
  3. Windows中Nginx下载、安装、配置
  4. 脑动力PHP函数速查效率手册pdf
  5. 数据结构——栈的应用
  6. win7计算机启动修复,win7启动修复功能无法正常进入系统的解决方法
  7. 概率论:魏布斯分布Weibull cumulative distribution function
  8. Atom使用教程:Atom下载,Atom汉化教程,Atom常用插件
  9. js git基本命令
  10. Linux下查看GPU显卡信息