最短路径(DP的应用)
单源最短路径,不允许出现负环
核心思想:更新估算距离,松弛
δ(u,v)≤δ(u,x)+δ(x,v)\delta(u, v) \leq \delta(u, x) + \delta(x, v) δ(u,v)≤δ(u,x)+δ(x,v)

时间复杂度与采用的数据结构有关,标准的dijkstra应该是用堆实现的。
Array O(v2v^2v2)
Binary heap O((V+E)lgV(V+E)lgV(V+E)lgV)
Fibonacci heap O(E+VlgVE+VlgVE+VlgV)

如果对于所有的边权值均为1,那么Dijkstra算法可以用BFS实现
使用FIFO队列代替Priority队列,其时间复杂度为O(V+EV+EV+E)

数组实现:

#include <iostream>
using namespace std;
void dijkstra();
int e[10][10];
int vis[10];
int dis[10];
int n, m;
int min1 = 99999999;
int u = 0;
int main()
{cin >> n >> m;// 初始化邻接表for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (i == j){e[i][j] = 0;}else{e[i][j] = 99999999;}}}// 填充数据for (int i = 1; i <= m; i++){int a, b, c;cin >> a >> b >> c;e[a][b] = c;}for (int i = 1; i <= n; i++){dis[i] = e[1][i];}vis[1] = 1;dijkstra();for (int i = 1; i <= n; i++){cout << dis[i];}system("pause");return 0;
}
void dijkstra()
{for (int i = 1; i <= n - 1; i++){min1 = 99999999;// 寻找权值最小的点ufor (int j = 1; j <= n; j++){if (vis[j] == 0 && dis[j] < min1){min1 = dis[j];u = j;}}vis[u] = 1;for (int v = 1; v <= n; v++){// 对于每个u可达的v来说if (e[u][v] < 99999999){// 如果当前的dis[v]不满足三角形不等式,那么进行松弛操作if (dis[v] > dis[u] + e[u][v]){dis[v] = dis[u] + e[u][v];}}}}
}

堆实现

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int Ni = 10000;
const int INF = 1 << 27;
struct node
{int point, value;// 构造node(int a, int b){point = a;value = b;}// 重载<操作符bool operator<(const node &a) const{// 对小于运算符进行重载,如果两个值相等,那么继续判断point,如果不等,则返回falseif (value == a.value){return point < a.point;}else{return value > a.value;}}
};
vector<node> e[Ni];
int dis[Ni], n;
priority_queue<node> q;
void dijkstra();
int main()
{int a, b, c, m;scanf("%d%d", &n, &m);while (m--){scanf("%d%d%d", &a, &b, &c);e[a].push_back(node(b, c));e[b].push_back(node(a, c));}// for (int i = 0; i <= n; i++)// {//     dis[i] = INF;// }memset(dis, 0x3f, sizeof(dis));dis[1] = 0;// 优先队列,队头元素最大,但是如果类型为struct需要重载<运算符q.push(node(1, dis[1]));dijkstra();for (int i = 1; i <= n; i++){printf("%d ", dis[i]);}system("pause");return 0;
}
void dijkstra()
{while (!q.empty()){node x = q.top();q.pop();for (int i = 0; i < e[x.point].size(); i++){node y = e[x.point][i];if (dis[y.point] > dis[x.point] + y.value){dis[y.point] = dis[x.point] + y.value;q.push(node(y.point, dis[y.point]));}}}
}

Dijkstra算法(c++版)相关推荐

  1. 朴素版Dijkstra算法

    文章目录 一.Dijkstra是什么? 二.使用步骤 1.Dijkstra的基本原理 2.时间复杂度 三.代码实现思路 四.代码实现 总结 一.Dijkstra是什么? Dijkstra算法是由荷兰计 ...

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

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

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

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

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

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

  5. Dijkstra算法(堆优化版求稀疏图最短路)

    南昌理工acm集训队 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 基本思想 Dijkstra算法是用来解决不 ...

  6. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

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

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

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

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

  9. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

最新文章

  1. VC++动态链接库编程之MFC DLL
  2. winform 自适应屏幕分辨率具体操作和注意事项
  3. 批量部署虚拟机实战解析
  4. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版
  5. java web 连接linux_如何将javaweb项目部署到linux下
  6. 反转!继SDA之后 WiFi联盟、蓝牙技术联盟、JEDEC协会恢复华为会员资格
  7. 95-250-040-源码-barrier机制-简介
  8. 【Linux】【Services】【Package】编译安装
  9. matlab 数字波束合成,dbf数字波束合成
  10. vue中使用腾讯视频播放器
  11. 【富文本】2.windows或office原版镜像怎么下载,msdn.itellyou上面列的项目的详细解读
  12. WebGIS第一课:测试高德API并通过
  13. quartus 复制IP核
  14. Java中一个数的N次方
  15. 解析几何:第五章 二次曲线(1)圆 椭圆 双曲线
  16. TypeScript-基础类型学习
  17. 电脑HDMI接电视 设置耳机输出声音
  18. Netbeans 8.0配置Python开发环境
  19. hdu1827 1269 2767 强连通分支 刷水
  20. 解决win10在安装Android-studio时提示HAXM无法安装问题

热门文章

  1. python用turtle画小人-画一个心送给心爱的小姐姐,Python绘图库Turtle
  2. 辽源天气预报软件测试,辽源天气预报15天
  3. 基于jsp+mysql的JSP在线水果销售商城系统设计实现
  4. 贪心法田忌赛马问题Java代码,hdoj 1052 Tian Ji - The Horse Racing【田忌赛马】 【贪心】...
  5. throw和throws的使用
  6. 河南大学计算机与信息工程学院张磊,张磊-食品与生物工程学院
  7. C++ 文本文件的读取和写入
  8. less linux命令,less 命令用法详解
  9. 【OpenCV 例程200篇】87. 频率域钝化掩蔽
  10. 【OpenCV 例程200篇】24. 图像的仿射变换